Compare commits

...

58 commits

Author SHA1 Message Date
Korina Cordero
23ca110a0b Fix the saving of warranty data. #555 2021-05-06 11:14:31 +00:00
Korina Cordero
63bc3a1aa6 Merge branch 'master' of gitlab.com:jankstudio/resq into 555-log-warranty-data-sent-via-api 2021-05-04 07:35:12 +00:00
0713bd9441 Merge branch '551-check-for-null-sku-for-warranty' into 'master'
Resolve "Check for null sku for warranty"

Closes #551

See merge request jankstudio/resq!654
2021-05-04 03:46:38 +00:00
Korina Cordero
f96540253a Added logging if blob download encounters errors. Add bulk download script. #551 2021-05-03 10:18:39 +00:00
Korina Cordero
b2e23e8ed9 Changed filename format for the file to retrieve. #551 2021-05-03 09:01:52 +00:00
Korina Cordero
87a9ec726e Composer update. #551 2021-05-03 06:56:18 +00:00
Korina Cordero
5c825ed9f4 Merge branch 'master' of gitlab.com:jankstudio/resq into 551-check-for-null-sku-for-warranty 2021-05-03 06:49:32 +00:00
Korina Cordero
c0a877e398 Add logging when creating warranty from command. #555 2021-04-30 10:30:44 +00:00
Korina Cordero
e235667952 Add logging for warranty creation for rider API and JO fulfillment. #555 2021-04-30 09:31:10 +00:00
Korina Cordero
c1d54ec626 Add logging when warranty is created via admin panel. #555 2021-04-30 08:45:18 +00:00
Korina Cordero
d2cae08fb0 Add logging for warranty creation in mobile API. #555 2021-04-30 08:12:00 +00:00
Korina Cordero
7ec5ba439c Add source to WarrantyAPILog. #555 2021-04-30 07:25:51 +00:00
Korina Cordero
42c2b52690 Merge branch 'master' of gitlab.com:jankstudio/resq into 555-log-warranty-data-sent-via-api 2021-04-30 06:34:13 +00:00
Korina Cordero
c6a0b96c90 Add action field to WarrantyAPILog. #555 2021-04-30 06:07:37 +00:00
22cd4c1320 Merge branch '556-enable-logging-via-monolog' into 'master'
Fix send sms bug causing 500 error #556

Closes #556

See merge request jankstudio/resq!660
2021-04-29 13:31:39 +00:00
d6357b32c7 Fix send sms bug causing 500 error #556 2021-04-29 21:31:03 +08:00
5432355e8b Merge branch '556-enable-logging-via-monolog' into 'master'
Resolve "Enable logging via monolog"

Closes #556

See merge request jankstudio/resq!659
2021-04-29 13:24:49 +00:00
726ace3207 Add monolog to composer #556 2021-04-29 21:23:53 +08:00
Korina Cordero
22047911e5 Add logging for register. #555 2021-04-29 10:04:03 +00:00
Korina Cordero
18b0417403 Add logging for creation of warranty. #555 2021-04-29 08:11:13 +00:00
Korina Cordero
24806d8b42 Merge branch '551-check-for-null-sku-for-warranty' of gitlab.com:jankstudio/resq into 555-log-warranty-data-sent-via-api 2021-04-29 03:37:09 +00:00
09614a1296 Merge branch '554-additional-hub-filters' into 'master'
Resolve "Additional Hub Filters"

Closes #554

See merge request jankstudio/resq!657
2021-04-28 07:28:39 +00:00
Korina Cordero
50f5896014 Removing logging of no rider out of controller and into service. #554 2021-04-28 06:00:23 +00:00
Korina Cordero
4337864c2c Add filter for rider availability. #554 2021-04-28 03:45:33 +00:00
Korina Cordero
140ea8c738 Add emergency filter. #554 2021-04-27 09:38:29 +00:00
Korina Cordero
63b989034d Add payment method filter. #554 2021-04-27 08:25:08 +00:00
Korina Cordero
0717df5fff Add saving of payment methods for hub. Fix issues found with notification number. #554 2021-04-27 06:16:40 +00:00
Korina Cordero
12798e00be Add payment methods to hub entity and form. #554 2021-04-27 04:14:48 +00:00
Korina Cordero
01cdd7ef03 Add checking for mobile number. #553 2021-04-27 02:42:06 +00:00
Korina Cordero
3c9070673f Add sending of SMS to hub if hub gets filtered out for no stock. #553 2021-04-26 07:48:51 +00:00
Korina Cordero
3a5d57e35c Merge branch '543-autoassign-revisions' of gitlab.com:jankstudio/resq into 552-add-notification-number-to-hub 2021-04-26 03:06:01 +00:00
Korina Cordero
f24f3e2bb9 Add notification number to hub. #552 2021-04-23 06:07:21 +00:00
Korina Cordero
17f800196d Merge branch 'master' of gitlab.com:jankstudio/resq into 543-autoassign-revisions 2021-04-21 03:25:55 +00:00
Korina Cordero
f7983e4c1d Add hub round robin to requestJobOrder. #543 2021-04-21 03:22:51 +00:00
Korina Cordero
a13c364934 Fix issues found during testing of warranty creation. #551 2021-04-20 06:42:36 +00:00
Korina Cordero
c97755cce0 Allow setting of battery information to null. #551 2021-04-20 03:22:07 +00:00
Korina Cordero
00c65d1e56 Add checking for empty sku. #551 2021-04-19 10:30:56 +00:00
Korina Cordero
9e1d855433 Fix load serials script to save everything. #549 2021-04-19 06:16:13 +00:00
Korina Cordero
699c135f33 Add script to get file from motiv. #549 2021-04-16 05:44:01 +00:00
Korina Cordero
60a4d0bb60 Add script to get the warranty file from storage. #549 2021-04-13 07:20:09 +00:00
Korina Cordero
6bc24c4756 Remove checking for jo type in newRequestJobOrder. #543 2021-03-30 09:03:19 +00:00
Korina Cordero
789d376d91 Merge branch 'master' of gitlab.com:jankstudio/resq into 543-autoassign-revisions 2021-03-30 02:04:17 +00:00
Korina Cordero
a5aef93ccb Add logging of hub if hub has no available rider. #543 2021-03-22 07:16:30 +00:00
Korina Cordero
4966e7e0c6 Add logging for filtered hubs. #543 2021-03-17 07:12:25 +00:00
Korina Cordero
2db7c6791f Add entity for logging of filtered hubs. #543 2021-03-17 03:09:33 +00:00
Korina Cordero
0ecc55cf56 Have admin panel use the HubSelector service when getting closest hubs. #543 2021-03-16 09:31:19 +00:00
Korina Cordero
c69a18d89b Add command to reset hub jo count in redis. #543 2021-03-16 08:19:20 +00:00
Korina Cordero
50e15cd770 Update hub_jo_count when hub is assigned or reassigned via admin panel. #543 2021-03-16 07:50:18 +00:00
Korina Cordero
0115328801 Add arranging of hubs, based on job orders assigned to hub. #543 2021-03-16 06:33:40 +00:00
Korina Cordero
1abaad1727 Add HubDistributor service. #543 2021-03-15 10:09:11 +00:00
Korina Cordero
0f245e9038 Fixes to issues found during testing. #543 2021-03-15 08:32:37 +00:00
Korina Cordero
498c88ce38 Add jo type, date, and inventory filters. #543 2021-03-15 03:46:13 +00:00
Korina Cordero
de74290624 Rename inventory flag. Fix find function. #543 2021-03-12 11:43:39 +00:00
Korina Cordero
d812e34797 Fix compilation error. #543 2021-03-12 07:02:26 +00:00
Korina Cordero
9a6ca7ae5d Add inventory manager service to HubSelector. #543 2021-03-12 06:54:09 +00:00
Korina Cordero
156742ea3a Add functions for the queries in HubSelector. #543 2021-03-11 09:56:07 +00:00
Korina Cordero
4efef6d397 Add HubSelector service. #543 2021-03-10 10:49:31 +00:00
Korina Cordero
09d04a8a7e Add hub criteria object. #543 2021-03-10 08:27:23 +00:00
43 changed files with 5464 additions and 1416 deletions

View file

@ -57,6 +57,7 @@ COUNTRY_CODE=+insert_country_code_here
# redis hash
LATEST_ACTIVE_JO=latest_active_jo
HUB_JO_KEY=hub_jo_count
# dashboard
DASHBOARD_ENABLE=set_to_true_or_false

View file

@ -25,6 +25,7 @@
"symfony/flex": "^1.0",
"symfony/framework-bundle": "^4.0",
"symfony/maker-bundle": "^1.0",
"symfony/monolog-bundle": "^3.7",
"symfony/orm-pack": "^1.0",
"symfony/process": "^4.0",
"symfony/profiler-pack": "^1.0",

4326
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -14,4 +14,5 @@ return [
Catalyst\APIBundle\CatalystAPIBundle::class => ['all' => true],
Catalyst\AuthBundle\CatalystAuthBundle::class => ['all' => true],
Catalyst\MenuBundle\CatalystMenuBundle::class => ['all' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
];

View file

@ -0,0 +1,19 @@
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event"]
# uncomment to get logging in your browser
# you may have to allow bigger header sizes in your Web server configuration
#firephp:
# type: firephp
# level: info
#chromephp:
# type: chromephp
# level: info
console:
type: console
process_psr_3_messages: false
channels: ["!event", "!doctrine", "!console"]

View file

@ -0,0 +1,8 @@
# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists
#monolog:
# channels: [deprecation]
# handlers:
# deprecation:
# type: stream
# channels: [deprecation]
# path: php://stderr

View file

@ -0,0 +1,17 @@
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
excluded_http_codes: [404, 405]
buffer_size: 50 # How many messages should be saved? Prevent memory leaks
nested:
type: stream
path: php://stderr
level: debug
formatter: monolog.formatter.json
console:
type: console
process_psr_3_messages: false
channels: ["!event", "!doctrine"]

View file

@ -0,0 +1,12 @@
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
excluded_http_codes: [404, 405]
channels: ["!event"]
nested:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug

View file

@ -266,3 +266,26 @@ services:
event: 'postPersist'
entity: 'App\Entity\CustomerVehicle'
# hub service
App\Service\HubSelector:
arguments:
$em: "@doctrine.orm.entity_manager"
$im: "@App\\Service\\InventoryManager"
$hub_distributor: "@App\\Service\\HubDistributor"
$hub_filter_logger: "@App\\Service\\HubFilterLogger"
# hub distributor
App\Service\HubDistributor:
arguments:
$redis: "@App\\Service\\RedisClientProvider"
$hub_jo_key: "%env(HUB_JO_KEY)%"
# hub filter logger
App\Service\HubFilterLogger:
arguments:
$em: "@doctrine.orm.entity_manager"
# warranty api logger
App\Service\WarrantyAPILogger:
arguments:
$em: "@doctrine.orm.entity_manager"

View file

@ -16,20 +16,25 @@ use App\Entity\JobOrder;
use App\Entity\Warranty;
use App\Entity\SAPBattery;
use App\Service\WarrantyAPILogger;
use App\Ramcar\ServiceType;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\WarrantySource;
use DoctrineExtensions\Query\Mysql\DateFormat;
class GenerateWarrantyFromJobOrderCommand extends Command
{
protected $em;
protected $logger;
protected $sapbatt_hash;
protected $warranties_hash;
public function __construct(EntityManagerInterface $em)
public function __construct(EntityManagerInterface $em, WarrantyAPILogger $logger)
{
$this->em = $em;
$this->logger = $logger;
$this->loadSAPBatteries();
@ -209,7 +214,27 @@ class GenerateWarrantyFromJobOrderCommand extends Command
$sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,serial,warranty_class,plate_number,status,date_create,date_purchase,date_expire,date_claim,sap_bty_id,claim_id,first_name,last_name,mobile_number,flag_activated,warranty_privacy_policy) VALUES ' . $values . "\n";
echo $sql_statement;
echo $sql_statement;
$db = $this->em->getConnection();
$stmt = $db->prepare($sql_statement);
$stmt->execute();
// log warranty creation
$log_data = [
'battery_model_id' => $bty_model_id,
'battery_size_id' => $bty_size_id,
'warranty_class' => $warranty_class,
'plate_number' => $cleaned_plate_number,
'date_create' => $date_create,
'date_purchase' => $date_purchase,
'date_expire' => $date_expire,
'sap_code' => $sap_code,
'first_name' => $first_name,
'last_name' => $last_name,
'mobile_number' => $mobile_number,
];
$this->logger->logWarrantyInfo($log_data, '', 'internal', 'create', WarrantySource::COMMAND);
}
else

View file

@ -0,0 +1,39 @@
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use App\Service\RedisClientProvider;
class ResetHubJoCountCommand extends Command
{
protected $redis;
public function __construct(RedisClientProvider $redis)
{
$this->redis = $redis->getRedisClient();
parent::__construct();
}
protected function configure()
{
$this->setName('hub:jo:reset')
->setDescription('Reset hub\'s job order count')
->setHelp('Reset hub\'s job order count');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$key = 'hub_jo_count';
$this->redis->del($key);
return 0;
}
}

View file

@ -28,6 +28,9 @@ use App\Ramcar\TradeInType;
use App\Ramcar\JOEventType;
use App\Ramcar\AdvanceOrderSlot;
use App\Ramcar\AutoAssignStatus;
use App\Ramcar\HubCriteria;
use App\Ramcar\WillingToWaitContent;
use App\Ramcar\WarrantySource;
use App\Service\InvoiceGeneratorInterface;
use App\Service\RisingTideGateway;
@ -37,6 +40,10 @@ use App\Service\RiderTracker;
use App\Service\MapTools;
use App\Service\InventoryManager;
use App\Service\RiderAssignmentHandlerInterface;
use App\Service\HubSelector;
use App\Service\HubDistributor;
use App\Service\HubFilterLogger;
use App\Service\WarrantyAPILogger;
use App\Entity\MobileSession;
use App\Entity\Customer;
@ -844,7 +851,8 @@ class APIController extends Controller implements LoggedController
public function requestJobOrder(Request $req, InvoiceGeneratorInterface $ic, GeofenceTracker $geo,
MapTools $map_tools, InventoryManager $im, MQTTClient $mclient,
RiderAssignmentHandlerInterface $rah)
RiderAssignmentHandlerInterface $rah, HubSelector $hub_select,
HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger)
{
// check required parameters and api key
$required_params = [
@ -917,6 +925,14 @@ class APIController extends Controller implements LoggedController
}
$jo->setServiceType($stype);
// check if willing to wait is true or not
$will_wait = $req->request->get('willing_to_wait');
// check for 'false' text
if ($will_wait === false || $will_wait === 0 || $will_wait === '0' || $will_wait == 'false')
$jo->setWillWait(WillingToWaitContent::NOT_WILLING_TO_WAIT);
else
$jo->setWillWait(WillingToWaitContent::WILLING_TO_WAIT);
// validate warranty
$warr = $req->request->get('warranty');
if (!WarrantyClass::validate($warr))
@ -1009,49 +1025,73 @@ class APIController extends Controller implements LoggedController
$invoice = $ic->generateInvoice($icrit);
$jo->setInvoice($invoice);
// assign hub and rider
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
// TODO: set this properly, since the other flags
// are on default values
$hub_criteria = new HubCriteria();
$hub_criteria->setPoint($jo->getCoordinates())
->setJoType($jo->getServiceType());
// add battery to items
$sku = $batt->getSAPCode();
if (!empty($sku))
$hub_criteria->addItem($batt->getSAPCode(), 1);
// add payment method to criteria
if (!empty($jo->getModeOfPayment()))
$hub_criteria->setPaymentMethod($jo->getModeOfPayment());
// check if willing to wait is true or not
if ($jo->getWillWait() == WillingToWaitContent::NOT_WILLING_TO_WAIT)
{
// get nearest hub
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
}
else
{
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
$hub_criteria->setEmergency(true);
}
if (!empty($nearest_hub))
// find nearest hubs
$nearest_hubs = $hub_select->find($hub_criteria);
if (!empty($nearest_hubs))
{
// go through the hub list, find the nearest hub
// with an available rider
//error_log('found nearest hub ' . $nearest_hub->getID());
// assign rider
$available_riders = $nearest_hub->getAvailableRiders();
if (count($available_riders) > 0)
foreach ($nearest_hubs as $nearest_hub)
{
$assigned_rider = null;
if (count($available_riders) > 1)
$available_riders = $nearest_hub['hub']->getAvailableRiders();
if (count($available_riders) >= 1)
{
// TODO: the setting of riders into an array
// will no longer be necessary when the contents
// of randomizeRider changes
$riders = [];
foreach ($available_riders as $rider)
$assigned_rider = null;
if (count($available_riders) == 1)
{
$riders[] = $rider;
$assigned_rider = $available_riders[0];
}
else
{
// TODO: the setting of riders into an array
// will no longer be necessary when the contents
// of randomizeRider changes
$riders = [];
foreach ($available_riders as $rider)
{
$riders[] = $rider;
}
$assigned_rider = $this->randomizeRider($riders);
}
$assigned_rider = $this->randomizeRider($riders);
}
else
$assigned_rider = $available_riders[0];
//error_log('found rider ' . $assigned_rider->getID());
$jo->setHub($nearest_hub);
$jo->setRider($assigned_rider);
$jo->setStatus(JOStatus::ASSIGNED);
$jo->setHub($nearest_hub['hub']);
$jo->setRider($assigned_rider);
$jo->setStatus(JOStatus::ASSIGNED);
$jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED);
$assigned_rider->setAvailable(false);
$assigned_rider->setAvailable(false);
// update redis hub_jo_count for hub
$hub_dist->incrementJoCountForHub($nearest_hub['hub']);
// break out of loop
break;
}
}
}
@ -2330,7 +2370,8 @@ class APIController extends Controller implements LoggedController
public function newRequestJobOrder(Request $req, InvoiceGeneratorInterface $ic, GeofenceTracker $geo,
MapTools $map_tools, InventoryManager $im, MQTTClient $mclient,
RiderAssignmentHandlerInterface $rah)
RiderAssignmentHandlerInterface $rah, HubSelector $hub_select,
HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger)
{
// check required parameters and api key
$required_params = [
@ -2419,6 +2460,14 @@ class APIController extends Controller implements LoggedController
}
$jo->setServiceType($stype);
// check if willing to wait is true or not
$will_wait = $req->request->get('willing_to_wait');
// check for 'false' text
if ($will_wait === false || $will_wait === 0 || $will_wait === '0' || $will_wait == 'false')
$jo->setWillWait(WillingToWaitContent::NOT_WILLING_TO_WAIT);
else
$jo->setWillWait(WillingToWaitContent::WILLING_TO_WAIT);
// validate warranty
$warr = $req->request->get('warranty');
if (!WarrantyClass::validate($warr))
@ -2515,50 +2564,72 @@ class APIController extends Controller implements LoggedController
// check if hub is null
if ($hub == null)
{
// find nearest hub
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
// TODO: set this properly, since the other flags
// are on default values
$hub_criteria = new HubCriteria();
$hub_criteria->setPoint($jo->getCoordinates())
->setJoType($jo->getServiceType());
// add battery to items
$sku = $batt->getSAPCode();
if (!empty($sku))
$hub_criteria->addItem($batt->getSAPCode(), 1);
// add payment method to criteria
if (!empty($jo->getModeOfPayment()))
$hub_criteria->setPaymentMethod($jo->getModeOfPayment());
// check if willing to wait is true or not
if ($jo->getWillWait() == WillingToWaitContent::NOT_WILLING_TO_WAIT)
{
// get nearest hub
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
}
else
{
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
$hub_criteria->setEmergency(true);
}
if (!empty($nearest_hub))
// find nearest hubs
$nearest_hubs = $hub_select->find($hub_criteria);
if (!empty($nearest_hubs))
{
// go through the hub list, find the nearest hub
// with an available rider
//error_log('found nearest hub ' . $nearest_hub->getID());
// assign rider
$available_riders = $nearest_hub->getAvailableRiders();
if (count($available_riders) > 0)
foreach ($nearest_hubs as $nearest_hub)
{
$assigned_rider = null;
if (count($available_riders) > 1)
$available_riders = $nearest_hub['hub']->getAvailableRiders();
if (count($available_riders) >= 1)
{
// TODO: the setting of riders into an array
// will no longer be necessary when the contents
// of randomizeRider changes
$riders = [];
foreach ($available_riders as $rider)
$assigned_rider = null;
if (count($available_riders) == 1)
{
$riders[] = $rider;
$assigned_rider = $available_riders[0];
}
else
{
// TODO: the setting of riders into an array
// will no longer be necessary when the contents
// of randomizeRider changes
$riders = [];
foreach ($available_riders as $rider)
{
$riders[] = $rider;
}
$assigned_rider = $this->randomizeRider($riders);
}
$assigned_rider = $this->randomizeRider($riders);
$jo->setHub($nearest_hub['hub']);
$jo->setRider($assigned_rider);
$jo->setStatus(JOStatus::ASSIGNED);
$jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED);
$assigned_rider->setAvailable(false);
// update redis hub_jo_count for hub
$hub_dist->incrementJoCountForHub($nearest_hub['hub']);
// break out of loop
break;
}
else
$assigned_rider = $available_riders[0];
//error_log('found rider ' . $assigned_rider->getID());
$jo->setHub($nearest_hub);
$jo->setRider($assigned_rider);
$jo->setStatus(JOStatus::ASSIGNED);
$jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED);
$assigned_rider->setAvailable(false);
}
}
}
@ -2581,7 +2652,10 @@ class APIController extends Controller implements LoggedController
$jo->setStatusAutoAssign(AutoAssignStatus::HUB_ASSIGNED);
if ($date_schedule != null)
$jo->setDateSchedule($date_schedule);
$jo->setDateSchedule($date_schedule);
// update redis hub_jo_count for hub
$hub_dist->incrementJoCountForHub($hub);
}
$em->persist($jo);
@ -2979,7 +3053,8 @@ class APIController extends Controller implements LoggedController
return $serial . '/' . $filename;
}
public function warrantyRegister($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans)
public function warrantyRegister($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt,
TranslatorInterface $trans, WarrantyAPILogger $logger)
{
// check required parameters and api key
$required_params = [
@ -3001,22 +3076,37 @@ class APIController extends Controller implements LoggedController
$inv_filename = $this->handlePictureUpload($invoice, $upload_dir, $serial, 'invoice');
$wcard_filename = $this->handlePictureUpload($warr_card, $upload_dir, $serial, 'wcard');
$user_id = $req->query->get('api_key');
$log_data = [
'plate_number' => $req->request->get('plate_num'),
'first_name' => $req->request->get('first_name'),
'last_name' => $req->request->get('last_name'),
'date_purchase' => $req->request->get('date_purchase'),
];
$action = 'create';
$source = WarrantySource::MOBILE;
$res = $this->checkParamsAndKey($req, $em, $required_params);
if ($res->isError())
{
$logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source);
return $res->getReturnResponse();
}
// update customer information
// $cust = $this->updateCustomerInfo($req, $em);
// update warranty
$res = $this->updateWarranty($res, $em, $trans, $req, $serial, $inv_filename, $wcard_filename);
$res = $this->updateWarranty($res, $em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename,
$logger, $log_data, $user_id, $action, $source);
$em->flush();
return $res->getReturnResponse();
}
protected function updateWarranty($res, $em, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null)
protected function updateWarranty($res, $em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null,
$logger, $log_data, $user_id, $action, $source)
{
// get serial
$warr_serial = $em->getRepository(WarrantySerial::class)->find($serial);
@ -3024,6 +3114,7 @@ class APIController extends Controller implements LoggedController
{
$res->setError(true)
->setErrorMessage('Invalid warranty serial code.');
$logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source);
return $res;
}
@ -3048,7 +3139,8 @@ class APIController extends Controller implements LoggedController
if (!$is_customer_warranty)
{
$res->setError(true)
->setErrorMessage('Warranty registred to a vehicle not in your list of vehicles.');
->setErrorMessage('Warranty registered to a vehicle not in your list of vehicles.');
$logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source);
return $res;
}
@ -3060,14 +3152,20 @@ class APIController extends Controller implements LoggedController
$sms_msg = $trans->trans('warranty_register_confirm');
}
// check if sku is null
// get sap battery
$sku = $warr_serial->getSKU();
$sap_bty = $em->getRepository(SAPBattery::class)->find($sku);
if ($sap_bty == null)
$sap_bty = null;
if ($sku != null)
{
$res->setError(true)
->setErrorMessage('Could not find battery entry for warranty.');
return $res;
$sap_bty = $em->getRepository(SAPBattery::class)->find($sku);
if ($sap_bty == null)
{
$res->setError(true)
->setErrorMessage('Could not find battery entry for warranty.');
$logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source);
return $res;
}
}
// default date purchase to today
@ -3080,6 +3178,7 @@ class APIController extends Controller implements LoggedController
{
$res->setError(true)
->setErrorMessage('Invalid date format for date of purchase.');
$logger->logWarrantyInfo($log_data, $res->getErrorMessage(), $user_id, $action, $source);
return $res;
}
@ -3124,6 +3223,8 @@ class APIController extends Controller implements LoggedController
// set data to retrun to user
$res->setData($data);
$logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
// send sms
error_log('sending sms to - ' . $this->session->getPhoneNumber());
$rt->sendSMS($this->session->getPhoneNumber(), 'MOTOLITE', $sms_msg);

View file

@ -14,6 +14,7 @@ use Catalyst\APIBundle\Controller\APIController;
use Catalyst\APIBundle\Response\APIResponse;
use App\Service\RisingTideGateway;
use App\Service\WarrantyAPILogger;
use App\Entity\WarrantySerial;
use App\Entity\Warranty;
@ -32,6 +33,7 @@ use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\FuelType;
use App\Ramcar\VehicleStatusCondition;
use App\Ramcar\WarrantySource;
use DateTime;
@ -73,13 +75,14 @@ class CustomerWarrantyController extends APIController
return $missing;
}
protected function checkRequiredParams(Request $req, $params)
protected function checkRequiredParams(Request $req, $params, $logger, $log_data, $user_id, $action, $source)
{
// check required parameters
$missing = $this->checkMissingParameters($req, $params);
if (count($missing) > 0)
{
$miss_string = implode(', ', $missing);
$logger->logWarrantyInfo($log_data, 'Missing parameter(s): ' . $miss_string, $user_id, $action, $source);
return new APIResponse(false, 'Missing parameter(s): ' . $miss_string);
}
@ -96,16 +99,32 @@ class CustomerWarrantyController extends APIController
return preg_replace('/\s+/', '', strtoupper($plate_num));
}
public function check($serial, EntityManagerInterface $em, Request $req)
public function check($serial, EntityManagerInterface $em, Request $req, WarrantyAPILogger $logger)
{
$user_id = $_SERVER['HTTP_X_CATA_API_KEY'];
$log_data = [
'serial' => $serial,
];
$action = 'check';
$source = WarrantySource::CAPI;
// check required parameters
$required_params = [];
$res = $this->checkRequiredParams($req, $required_params);
if (!$res)
return $res;
$res = $this->checkRequiredParams($req, $required_params, $logger, $log_data, $user_id, $action, $source);
if (!$res)
return $res;
error_log('check warranty serial');
//$keys = array_keys($_SERVER);
//foreach ($keys as $key)
//{
// error_log($key);
//}
//error_log($_SERVER['HTTP_X_CATA_API_KEY']);
// TODO: add logging for the other scenarios
// check if warranty serial is there
$warr_serial = $em->getRepository(WarrantySerial::class)->find($serial);
$warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $serial]);
@ -232,7 +251,11 @@ class CustomerWarrantyController extends APIController
}
$sku = $warr_serial->getSKU();
$batt = $em->getRepository(SAPBattery::class)->find($sku);
// check if sku is null
$batt = null;
if ($sku != null)
$batt = $em->getRepository(SAPBattery::class)->find($sku);
// TODO: put this in a config file
$image_url = $req->getSchemeAndHttpHost() . '/battery/generic.png';
if ($batt != null)
@ -275,18 +298,40 @@ class CustomerWarrantyController extends APIController
}
public function register($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans)
public function register($serial, EntityManagerInterface $em, Request $req, KernelInterface $kernel, RisingTideGateway $rt, TranslatorInterface $trans,
WarrantyAPILogger $logger)
{
error_log('HERE - register');
// check required parameters
// TODO: maybe add vmake_id? since warranty cannot be created with no vmake
// TODO: maye also add mobile and email since customer creation won't let mobile and email be null
// set up information for logging
// get user from header
$user_id = $_SERVER['HTTP_X_CATA_API_KEY'];
$log_data = [
'serial' => $serial,
'plate_number' => $req->request->get('plate_num'),
'first_name' => $req->request->get('first_name'),
'last_name' => $req->request->get('last_name'),
'vmake_id' => $req->request->get('vmake_id'),
'contact_number' => $req->request->get('contact_num'),
'email' => $req->request->get('email'),
'invoice' => $req->request->get('invoice'),
];
$action = 'create/update';
$source = WarrantySource::CAPI;
error_log('SOURCE: ' . $source);
$required_params = [
'first_name',
'last_name',
'plate_num'
];
$res = $this->checkRequiredParams($req, $required_params);
if (!$res)
return $res;
$res = $this->checkRequiredParams($req, $required_params, $logger, $log_data, $user_id, $action, $source);
if (!$res)
return $res;
// file uploads
$invoice = $req->files->get('invoice');
@ -299,12 +344,13 @@ class CustomerWarrantyController extends APIController
$wcard_filename = $this->handlePictureUpload($warr_card, $upload_dir, $serial, 'wcard');
// do actual registering
$res = $this->updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename);
$res = $this->updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename, $wcard_filename,
$logger, $log_data, $user_id, $action, $source);
// flush to db
$em->flush();
return $res;
return $res;
return new APIResponse(true, 'Warranty registered.');
}
@ -340,7 +386,8 @@ class CustomerWarrantyController extends APIController
return $serial . '/' . $filename;
}
protected function updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null)
protected function updateWarranty($em, $rt, $trans, $req, $serial, $inv_filename = null, $wcard_filename = null,
$logger, $log_data, $user_id, $action, $source)
{
$plate_num = $this->cleanPlateNumber($req->request->get('plate_num'));
@ -349,6 +396,7 @@ class CustomerWarrantyController extends APIController
$warr_serial = $em->getRepository(WarrantySerial::class)->find($serial);
if ($warr_serial == null)
{
$logger->logWarrantyInfo($log_data, 'Invalid warranty serial code..', $user_id, $action, $source);
return new APIResponse(false, 'Invalid warranty serial code.');
}
@ -364,6 +412,7 @@ class CustomerWarrantyController extends APIController
if ($plate_num != $warr_plate_num)
{
$logger->logWarrantyInfo($log_data, 'Plate number does not match vehicle registered to warranty.', $user_id, $action, $source);
return new APIResponse(false, 'Plate number does not match vehicle registered to warranty.');
}
@ -381,10 +430,17 @@ class CustomerWarrantyController extends APIController
error_log('sap battery check');
// get sap battery
$sku = $warr_serial->getSKU();
$sap_bty = $em->getRepository(SAPBattery::class)->find($sku);
if ($sap_bty == null)
$sap_bty = null;
// check if sku is null
if ($sku != null)
{
return new APIResponse(false, 'Could not find battery entry for warranty.');
$sap_bty = $em->getRepository(SAPBattery::class)->find($sku);
if ($sap_bty == null)
{
$logger->logWarrantyInfo($log_data, 'Cound not find battery entry for warranty.', $user_id, $action, $source);
return new APIResponse(false, 'Could not find battery entry for warranty.');
}
}
// vehicle fetch
@ -395,6 +451,7 @@ class CustomerWarrantyController extends APIController
$vehicle = $em->getRepository(Vehicle::class)->find($vmake_id);
if ($vehicle == null)
{
$logger->logWarrantyInfo($log_data, 'Could not find vehicle specified for warranty.', $user_id, $action, $source);
return new APIResponse(false, 'Could not find vehicle specified for warranty.');
}
}
@ -403,15 +460,20 @@ class CustomerWarrantyController extends APIController
// default date purchase to today
// NOTE: might need to change this later
$date_pur = new DateTime();
$date_pur_cust = new DateTime();
// get date purchase specified by customer
$date_pur_cust = DateTime::createFromFormat('Y-m-d', $req->request->get('date_purchase'));
if (!$date_pur_cust)
if (!empty($req->request->get('date_purchase')))
{
return new APIResponse(false, 'Invalid date format for date of purchase.');
$date_pur_cust = DateTime::createFromFormat('Y-m-d', $req->request->get('date_purchase'));
if (!$date_pur_cust)
{
$logger->logWarrantyInfo($log_data, 'Invalid date format for date of purchase.', $user_id, $action, $source);
return new APIResponse(false, 'Invalid date format for date of purchase.');
}
}
// chstomer check
// customer check
$priv_promo = $req->request->get('priv_promo', false);
if ($cust == null)
{
@ -483,14 +545,15 @@ class CustomerWarrantyController extends APIController
$em->persist($warr);
$logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
// TODO: check if we need to do anyting else
$data = [];
// send sms confirmation
$this->sendSMSConfirmation($rt, $req->request->get('contact_num'), $sms_message);
return new APIResponse(true, 'Warranty registered.', $data);
return new APIResponse(true, 'Warranty registered.', $data);
}
protected function sendSMSConfirmation($rt, $num, $message)

View file

@ -20,12 +20,16 @@ use App\Entity\PrivacyPolicy;
use App\Entity\Customer;
use App\Entity\CustomerVehicle;
use App\Entity\Vehicle;
use App\Entity\WarrantyAPILog;
use App\Service\WarrantyAPILogger;
use App\Ramcar\NameValue;
use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\FuelType;
use App\Ramcar\VehicleStatusCondition;
use App\Ramcar\WarrantySource;
use DateTime;
@ -142,7 +146,7 @@ class WarrantyController extends APIController
return new APIResponse(true, 'Warranties found.', $data);
}
public function register(Request $req, EntityManagerInterface $em)
public function register(Request $req, EntityManagerInterface $em, WarrantyAPILogger $logger)
{
$this->denyAccessUnlessGranted('warranty.register.battery', null, 'No access.');
@ -159,10 +163,6 @@ class WarrantyController extends APIController
'battery_size_id',
*/
];
$msg = $this->checkRequiredParameters($req, $params);
error_log('msg - ' . $msg);
if ($msg)
return new APIResponse(false, $msg);
$serial = $req->request->get('serial');
$date_expire_string = $req->request->get('date_expire');
@ -175,6 +175,31 @@ class WarrantyController extends APIController
$lname = $req->request->get('last_name', null);
$mnum = $req->request->get('mobile_number', null);
// set up information for logging
// get user from header
$user_id = $_SERVER['HTTP_X_CATA_API_KEY'];
$log_data = [
'serial' => $serial,
'date_expire' => $date_expire_string,
'date_pur_string' => $date_pur_string,
'warranty_class' => $warr_class,
'plate_number' => $plate,
'sku' => $sku,
'first_name' => $fname,
'last_name' => $lname,
'mobile_number' => $mnum,
];
$action = 'create';
$source = WarrantySource::CAPI;
$msg = $this->checkRequiredParameters($req, $params);
error_log('msg - ' . $msg);
if ($msg)
{
$logger->logWarrantyInfo($log_data, $msg, $user_id, $action, $source);
return new APIResponse(false, $msg);
}
/*
$bmodel_id = $req->request->get('battery_model_id');
$bsize_id = $req->request->get('battery_size_id');
@ -183,26 +208,47 @@ class WarrantyController extends APIController
// wrong date expire format
$date_expire = DateTime::createFromFormat('Ymd', $date_expire_string);
if ($date_expire === false)
{
$logger->logWarrantyInfo($log_data, 'Wrong date format: date_expire.', $user_id, $action, $source);
return new APIResponse(false, 'Wrong date format: date_expire.');
}
// wrong date purchase format
$date_pur = DateTime::createFromFormat('Ymd', $date_pur_string);
if ($date_pur === false)
{
$logger->logWarrantyInfo($log_data, 'Wrong date format: date_purchase', $user_id, $action, $source);
return new APIResponse(false, 'Wrong date format: date_purchase.');
}
// valid warranty class
if (!WarrantyClass::validate($warr_class))
{
$logger->logWarrantyInfo($log_data, 'Invalid warranty class.', $user_id, $action, $source);
return new APIResponse(false, 'Invalid warranty class.');
}
// plate number
$plate = Warranty::cleanPlateNumber($plate);
if (!$plate)
{
$logger->logWarrantyInfo($log_data, 'Invalid plate number.', $user_id, $action, $source);
return new APIResponse(false, 'Invalid plate number.');
}
// battery
$batt = $em->getRepository(SAPBattery::class)->find($sku);
if ($batt == null)
return new APIResponse(false, 'Invalid battery SKU.');
// check if sku is blank
if ((empty($sku)) || ($sku == null))
$batt = null;
else
{
// battery
$batt = $em->getRepository(SAPBattery::class)->find($sku);
if ($batt == null)
{
$logger->logWarrantyInfo($log_data, 'Invalid battery SKU.', $user_id, $action, $source);
return new APIResponse(false, 'Invalid battery SKU.');
}
}
/*
// battery model
@ -239,6 +285,7 @@ class WarrantyController extends APIController
}
catch (UniqueConstraintViolationException $e)
{
$logger->logWarrantyInfo($log_data, 'Duplicate serial encountered.', $user_id, $action, $source);
return new APIResponse(false, 'Duplicate serial encountered.');
}
@ -247,10 +294,13 @@ class WarrantyController extends APIController
'warranty' => $this->generateWarrantyData($warr),
];
// log creation of warranty data
$logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
return new APIResponse(true, 'Warranty registered.', $data);
}
public function claim(Request $req, EntityManagerInterface $em, $id)
public function claim(Request $req, EntityManagerInterface $em, $id, WarrantyAPILogger $logger)
{
$this->denyAccessUnlessGranted('warranty.claim', null, 'No access.');
@ -258,26 +308,50 @@ class WarrantyController extends APIController
$params = [
'serial',
];
$serial = $req->request->get('serial');
// set up information for logging
// get user from header
$user_id = $_SERVER['HTTP_X_CATA_API_KEY'];
$log_data = [
'serial' => $serial,
'id' => $id,
];
$action = 'claim';
$source = WarrantySource::CAPI;
$msg = $this->checkRequiredParameters($req, $params);
if ($msg)
{
$logger->logWarrantyInfo($log_data, $msg, $user_id, $action, $source);
return new APIResponse(false, $msg);
}
// no warranty
$warr = $em->getRepository(Warranty::class)->find($id);
if ($warr == null)
{
$logger->logWarrantyInfo($log_data, 'No warranty found with that id.', $user_id, $action, $source);
return new APIResponse(false, 'No warranty found with that id.', null, 404);
}
// warranty is not active
if (!$warr->canClaim())
{
$logger->logWarrantyInfo($log_data, 'Warranty is not active.', $user_id, $action, $source);
return new APIResponse(false, 'Warranty is not active.');
}
// check if new serial has been used
$serial = $req->request->get('serial');
$clean_serial = $this->cleanSerial($serial);
$check_warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $clean_serial]);
if ($check_warr != null)
{
$logger->logWarrantyInfo($log_data, 'Serial for replacement has already been used.', $user_id, $action, $source);
return new APIResponse(false, 'Serial for replacement has already been used.');
}
// set status to claim
$warr->setStatus(WarrantyStatus::CLAIMED)
@ -303,6 +377,7 @@ class WarrantyController extends APIController
$em->flush();
// TODO: claim log
$logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
return new APIResponse(true, 'Warranty claimed successfully.');
}
@ -382,10 +457,16 @@ class WarrantyController extends APIController
if (!$plate)
return new APIResponse(false, 'Invalid plate number.');
// battery
$batt = $em->getRepository(SAPBattery::class)->find($sku);
if ($batt == null)
return new APIResponse(false, 'Invalid battery SKU.');
// check if sku is blank
if ((empty($sku)) || ($sku == null))
$batt = null;
else
{
// battery
$batt = $em->getRepository(SAPBattery::class)->find($sku);
if ($batt == null)
return new APIResponse(false, 'Invalid battery SKU.');
}
$warr->setSerial($serial)
->setWarrantyClass($warr_class)
@ -634,6 +715,7 @@ class WarrantyController extends APIController
$w_last_name = $warranty->getLastName();
$new_cust = new Customer();
// TODO: add customer source
$new_cust->setFirstName($w_first_name)
->setLastName($w_last_name)
->setPhoneMobile($w_mobile_num);
@ -691,5 +773,4 @@ class WarrantyController extends APIController
$customers = $em->getRepository(Customer::class)->findBy(['phone_mobile' => $number]);
return $customers;
}
}

View file

@ -17,8 +17,12 @@ use DateTime;
use Catalyst\MenuBundle\Annotation\Menu;
use App\Service\MapTools;
use App\Service\RiderTracker;
use App\Service\RisingTideGateway;
use App\Service\HubSelector;
use App\Ramcar\HubCriteria;
use App\Ramcar\ModeOfPayment;
class HubController extends Controller
{
@ -128,6 +132,7 @@ class HubController extends Controller
$params = [];
$params['obj'] = new Hub();
$params['mode'] = 'create';
$params['payment_methods'] = ModeOfPayment::getCollection();
// response
return $this->render('hub/form.html.twig', $params);
@ -154,7 +159,17 @@ class HubController extends Controller
->setBranchCode($req->request->get('branch_code', ''))
->setStatusOpen($req->request->get('status_open', false))
->setRiderSlots($req->request->get('rider_slots', 0))
->setHubViewFlag($req->request->get('flag_hub_view', false));
->setHubViewFlag($req->request->get('flag_hub_view', false))
->setNotifNumber($req->request->get('notif_number'))
->clearPaymentMethods();
// set payment methods
$payment_methods = $req->request->get('payment_methods');
if (!empty($payment_methods))
{
$obj->setPaymentMethods($payment_methods);
}
}
protected function setQueryFilters($datatable, QueryBuilder $query)
@ -166,7 +181,7 @@ class HubController extends Controller
}
}
public function addSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator)
public function addSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, RisingTideGateway $rt)
{
$this->denyAccessUnlessGranted('hub.add', null, 'No access.');
@ -176,14 +191,23 @@ class HubController extends Controller
$em = $this->getDoctrine()->getManager();
$obj = new Hub();
// initialize error list
$error_array = [];
// validate the notification number
$mobile = $req->request->get('notif_number');
if (!empty($mobile))
{
$is_valid = $rt->validatePhoneNumber($mobile);
if (!$is_valid)
$error_array['notif_number'] = 'Invalid notification number';
}
$this->setObject($obj, $req);
// validate
$errors = $validator->validate($obj);
// initialize error list
$error_array = [];
// add errors to list
foreach ($errors as $error) {
$error_array[$error->getPropertyPath()] = $error->getMessage();
@ -226,12 +250,13 @@ class HubController extends Controller
$params = [];
$params['obj'] = $obj;
$params['mode'] = 'update';
$params['payment_methods'] = ModeOfPayment::getCollection();
// response
return $this->render('hub/form.html.twig', $params);
}
public function updateSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, $id)
public function updateSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator, $id, RisingTideGateway $rt)
{
$this->denyAccessUnlessGranted('hub.update', null, 'No access.');
@ -243,14 +268,23 @@ class HubController extends Controller
if (empty($obj))
throw $this->createNotFoundException('The item does not exist');
// initialize error list
$error_array = [];
// validate the notification number
$mobile = $req->request->get('notif_number');
if (!empty($mobile))
{
$is_valid = $rt->validatePhoneNumber($mobile);
if (!$is_valid)
$error_array['notif_number'] = 'Invalid notification number';
}
$this->setObject($obj, $req);
// validate
$errors = $validator->validate($obj);
// initialize error list
$error_array = [];
// add errors to list
foreach ($errors as $error) {
$error_array[$error->getPropertyPath()] = $error->getMessage();
@ -295,7 +329,7 @@ class HubController extends Controller
$response->send();
}
public function nearest(MapTools $map_tools, Request $req)
public function nearest(HubSelector $hub_selector, Request $req)
{
// get lat / long
$lat = $req->query->get('lat');
@ -303,7 +337,12 @@ class HubController extends Controller
// get nearest hubs according to position
$point = new Point($long, $lat);
$result = $map_tools->getClosestHubs($point, 10, date("H:i:s"));
// set up hub criteria
$hub_criteria = new HubCriteria();
$hub_criteria->setPoint($point);
$hub_selector->find($hub_criteria);
//$result = $map_tools->getClosestHubs($point, 10, date("H:i:s"));
$hubs = [];
foreach ($result as $hub_res)

View file

@ -23,6 +23,7 @@ use App\Service\MapTools;
use App\Service\MQTTClient;
use App\Service\APNSClient;
use App\Service\InventoryManager;
use App\Service\HubSelector;
use App\Service\RiderTracker;
use App\Service\MotivConnector;
@ -315,13 +316,13 @@ class JobOrderController extends Controller
/**
* @Menu(selected="jo_proc")
*/
public function processingForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis, MotivConnector $motiv)
public function processingForm(HubSelector $hub_selector, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis, MotivConnector $motiv)
{
$this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.');
try
{
$params = $jo_handler->initializeProcessingForm($id, $map_tools, $motiv);
$params = $jo_handler->initializeProcessingForm($id, $hub_selector, $motiv);
}
catch (AccessDeniedHttpException $e)
{
@ -504,14 +505,14 @@ class JobOrderController extends Controller
/**
* @Menu(selected="jo_open")
*/
public function openHubForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler,
public function openHubForm(HubSelector $hub_selector, $id, JobOrderHandlerInterface $jo_handler,
GISManagerInterface $gis)
{
$this->denyAccessUnlessGranted('jo_open.list', null, 'No access.');
try
{
$params = $jo_handler->initializeHubForm($id, $map_tools);
$params = $jo_handler->initializeHubForm($id, $hub_selector);
}
catch (NotFoundHttpException $e)
{
@ -1204,6 +1205,7 @@ class JobOrderController extends Controller
]);
}
// this is uncalled or does not display in admin panel
/**
* @Menu(selected="jo_autoassign")
*/
@ -1223,6 +1225,7 @@ class JobOrderController extends Controller
return $this->render($template, $params);
}
// this is uncalled or does not display in admin panel
public function autoAssignSubmit(Request $req, JobOrderHandlerInterface $jo_handler,
EntityManagerInterface $em, MapTools $map_tools,
InventoryManager $im)

View file

@ -12,8 +12,10 @@ use App\Entity\CustomerVehicle;
use App\Ramcar\WarrantyClass;
use App\Ramcar\WarrantyStatus;
use App\Ramcar\WarrantySource;
use App\Service\WarrantyHandler;
use App\Service\WarrantyAPILogger;
use Doctrine\ORM\Query;
use Doctrine\ORM\EntityManagerInterface;
@ -149,7 +151,7 @@ class WarrantyController extends Controller
return $this->render('warranty/form.html.twig', $params);
}
public function addSubmit(Request $req, ValidatorInterface $validator)
public function addSubmit(Request $req, ValidatorInterface $validator, WarrantyAPILogger $logger)
{
$this->denyAccessUnlessGranted('warranty.add', null, 'No access.');
@ -181,31 +183,52 @@ class WarrantyController extends Controller
}
// custom validation for battery model
$model = $em->getRepository(BatteryModel::class)
->find($req->request->get('battery_model'));
// check if battery model is blank
$bmodel = $req->request->get('battery_model');
if (!empty($bmodel))
{
$model = $em->getRepository(BatteryModel::class)
->find($req->request->get('battery_model'));
if (empty($model))
$error_array['battery_model'] = 'Invalid model selected.';
if (empty($model))
$error_array['battery_model'] = 'Invalid model selected.';
else
$obj->setBatteryModel($model);
}
else
$obj->setBatteryModel($model);
$obj->setBatteryModel(NULL);
// custom validation for battery size
$size = $em->getRepository(BatterySize::class)
->find($req->request->get('battery_size'));
// check if battery size is blank
$bsize = $req->request->get('battery_size');
if (!empty($bsize))
{
$size = $em->getRepository(BatterySize::class)
->find($req->request->get('battery_size'));
if (empty($size))
$error_array['battery_size'] = 'Invalid size selected.';
if (empty($size))
$error_array['battery_size'] = 'Invalid size selected.';
else
$obj->setBatterySize($size);
}
else
$obj->setBatterySize($size);
$obj->setBatterySize(NULL);
// custom validation for SAP battery
$sap = $em->getRepository(SAPBattery::class)
->find($req->request->get('sap_battery'));
// check if sap battery is blank
$sap_battery = $req->request->get('sap_battery');
if (!empty($sap_battery))
{
$sap = $em->getRepository(SAPBattery::class)
->find($req->request->get('sap_battery'));
if (empty($sap))
$error_array['sap_battery'] = 'Invalid SAP battery selected.';
if (empty($sap))
$error_array['sap_battery'] = 'Invalid SAP battery selected.';
else
$obj->setSAPBattery($sap);
}
else
$obj->setSAPBattery($sap);
$obj->setSAPBattery(NULL);
// validate
$errors = $validator->validate($obj);
@ -234,6 +257,28 @@ class WarrantyController extends Controller
$em->persist($obj);
$em->flush();
// log warranty creation
$action = 'create';
$user_id = $this->getUser()->getUsername();
$source = WarrantySource::ADMIN_PANEL;
$log_data = [
'serial' => $req->request->get('serial'),
'warranty_class' => $req->request->get('warranty_class'),
'first_name' => $req->request->get('first_name'),
'last_name' => $req->request->get('last_name'),
'mobile_number' => $req->request->get('mobile_number'),
'date_purchase' => $req->request->get('date_purchase'),
'claim_from' => $req->request->get('claim_from'),
'status' => $req->request->get('status'),
'date_claim' => $req->request->get('date_claim'),
'date_expire' => $req->request->get('date_expire'),
'battery_model' => $req->request->get('battery_model'),
'battery_size' => $req->request->get('battery_size'),
'sap_battery' => $req->request->get('sap_battery'),
'plate_number' => $req->request->get('plate_number'),
];
$logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
// return successful response
return $this->json([
'success' => 'Changes have been saved!'
@ -303,31 +348,52 @@ class WarrantyController extends Controller
}
// custom validation for battery model
$model = $em->getRepository(BatteryModel::class)
->find($req->request->get('battery_model'));
// check if battery model is blank
$bmodel = $req->request->get('battery_model');
if (!empty($bmodel))
{
$model = $em->getRepository(BatteryModel::class)
->find($req->request->get('battery_model'));
if (empty($model))
$error_array['battery_model'] = 'Invalid model selected.';
if (empty($model))
$error_array['battery_model'] = 'Invalid model selected.';
else
$obj->setBatteryModel($model);
}
else
$obj->setBatteryModel($model);
$obj->setBatteryModel(null);
// custom validation for battery size
$size = $em->getRepository(BatterySize::class)
->find($req->request->get('battery_size'));
// check if battery size is blank
$bsize = $req->request->get('battery_size');
if (!empty($bsize))
{
$size = $em->getRepository(BatterySize::class)
->find($req->request->get('battery_size'));
if (empty($size))
$error_array['battery_size'] = 'Invalid size selected.';
if (empty($size))
$error_array['battery_size'] = 'Invalid size selected.';
else
$obj->setBatterySize($size);
}
else
$obj->setBatterySize($size);
$obj->setBatterySize(null);
// custom validation for SAP battery
$sap = $em->getRepository(SAPBattery::class)
->find($req->request->get('sap_battery'));
// check if sap battery is blank
$sap_battery = $req->request->get('sap_battery');
if (!empty($sap_battery))
{
$sap = $em->getRepository(SAPBattery::class)
->find($req->request->get('sap_battery'));
if (empty($sap))
$error_array['sap_battery'] = 'Invalid SAP battery selected.';
if (empty($sap))
$error_array['sap_battery'] = 'Invalid SAP battery selected.';
else
$obj->setSAPBattery($sap);
}
else
$obj->setSAPBattery($sap);
$obj->setSAPBattery(null);
// validate
$errors = $validator->validate($obj);
@ -598,8 +664,12 @@ class WarrantyController extends Controller
}
// error_log('Creating warranty for serial ' . $serial . ' and plate number ' . $plate_number);
$user_id = $this->getUser()->getUsername();
$source = WarrantySource::BULK_UPLOAD;
$wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class,
$user_id, $source);
$wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class);
}
}
@ -635,4 +705,5 @@ class WarrantyController extends Controller
// remove spaces and make upper case
return strtoupper(str_replace(' ', '', $plate));
}
}

View file

@ -68,6 +68,18 @@ class Hub
*/
protected $flag_hub_view;
// notification number to send SMS to if hub doesn't have item
/**
* @ORM\Column(type="string", length=30)
*/
protected $notif_number;
// payment methods
/**
* @ORM\Column(type="array", nullable=true)
*/
protected $payment_methods;
public function __construct()
{
$this->time_open = new DateTime();
@ -76,6 +88,8 @@ class Hub
$this->outlets = new ArrayCollection();
$this->status_open = true;
$this->flag_hub_view = false;
$this->notif_number = '';
$this->payment_methods = new ArrayCollection();
}
public function getRiders()
@ -185,5 +199,38 @@ class Hub
return $this->flag_hub_view;
}
public function setNotifNumber($notif_number)
{
$this->notif_number = $notif_number;
return $this;
}
public function getNotifNumber()
{
return $this->notif_number;
}
public function getPaymentMethods()
{
return $this->payment_methods;
}
public function setPaymentMethods(array $payment_methods)
{
$this->payment_methods = new ArrayCollection();
foreach ($payment_methods as $payment_method)
{
$this->payment_methods->add($payment_method);
}
return $this;
}
public function clearPaymentMethods()
{
$this->payment_methods = new ArrayCollection();
return $this;
}
}

View file

@ -0,0 +1,83 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use App\Entity\Hub;
use DateTime;
/**
* @ORM\Entity
* @ORM\Table(name="hub_filter_log")
*/
class HubFilterLog
{
// unique id
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// date created
/**
* @ORM\Column(type="datetime")
*/
protected $date_create;
// hub that was not included in results
/**
* @ORM\ManyToOne(targetEntity="Hub", inversedBy="hub_filtered")
* @ORM\JoinColumn(name="hub_filtered_id", referencedColumnName="id", nullable=true)
*/
protected $hub;
// filter that eliminated hub
/**
* @ORM\Column(type="string", length=80)
* @Assert\NotBlank()
*/
protected $filter_type_id;
public function __construct()
{
$this->date_create = new DateTime();
}
public function getID()
{
return $this->id;
}
public function getDateCreate()
{
return $this->date_create;
}
public function setHub(Hub $hub)
{
$this->hub = $hub;
return $this;
}
public function getHub()
{
return $this->hub;
}
public function setFilterTypeId($filter_type_id)
{
$this->filter_type_id = $filter_type_id;
return $this;
}
public function getFilterTypeId()
{
return $this->filter_type_id;
}
}

View file

@ -73,14 +73,14 @@ class Warranty
// battery model
/**
* @ORM\ManyToOne(targetEntity="BatteryModel", inversedBy="warranties")
* @ORM\JoinColumn(name="bty_model_id", referencedColumnName="id")
* @ORM\JoinColumn(name="bty_model_id", referencedColumnName="id", nullable=true)
*/
protected $bty_model;
// battery size
/**
* @ORM\ManyToOne(targetEntity="BatterySize", inversedBy="warranties")
* @ORM\JoinColumn(name="bty_size_id", referencedColumnName="id")
* @ORM\JoinColumn(name="bty_size_id", referencedColumnName="id", nullable=true)
*/
protected $bty_size;
@ -371,7 +371,7 @@ class Warranty
return $this->mobile_number;
}
public function setBatteryModel(BatteryModel $model)
public function setBatteryModel(BatteryModel $model = null)
{
$this->bty_model = $model;
return $this;
@ -382,7 +382,7 @@ class Warranty
return $this->bty_model;
}
public function setBatterySize(BatterySize $size)
public function setBatterySize(BatterySize $size = null)
{
$this->bty_size = $size;
return $this;
@ -393,7 +393,7 @@ class Warranty
return $this->bty_size;
}
public function setSAPBattery(SAPBattery $sap_bty)
public function setSAPBattery(SAPBattery $sap_bty = null)
{
$this->sap_bty = $sap_bty;
return $this;

View file

@ -0,0 +1,163 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use DateTime;
/**
* @ORM\Entity
* @ORM\Table(name="warranty_api_log")
*/
class WarrantyAPILog
{
// unique id
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// date created
/**
* @ORM\Column(type="datetime")
*/
protected $date_create;
// user that created warranty
/**
* @ORM\Column(type="string", length=32)
*/
protected $api_user;
// data sent
/**
* @ORM\Column(type="json")
*/
protected $all_data;
// errors
/**
* @ORM\Column(type="array", nullable=true)
*/
protected $errors;
// action
/**
* @ORM\Column(type="string", length=20)
*/
protected $action;
// source
/**
* @ORM\Column(type="string", length=30)
*/
protected $source;
public function __construct()
{
$this->date_create = new DateTime();
$this->errors = new ArrayCollection();
$this->all_data = [];
$this->action = '';
$this->source = '';
}
public function getID()
{
return $this->id;
}
public function setDateCreate(DateTime $date_create)
{
$this->date_create = $date_create;
return $this;
}
public function getDateCreate()
{
return $this->date_create;
}
public function setApiUser($api_user)
{
$this->api_user = $api_user;
return $this;
}
public function getApiUser()
{
return $this->api_user;
}
public function addAllData($id, $value)
{
$this->all_data[$id] = $value;
return $this;
}
public function setAllData($all_data)
{
$this->all_data = $all_data;
return $this;
}
public function getAllData($id)
{
// return null if we don't have it
if (!isset($this->all_data[$id]))
return null;
return $this->all_data[$id];
}
public function getErrors()
{
return $this->errors;
}
public function setErrors(array $errors)
{
$this->errors = new ArrayCollection();
foreach ($errors as $error)
{
$this->errors->add($error);
}
return $this;
}
public function clearErrors()
{
$this->errors = new ArrayCollection();
return $this;
}
public function setAction($action)
{
$this->action = $action;
return $this;
}
public function getAction()
{
return $this->action;
}
public function setSource($source)
{
$this->source = $source;
return $this;
}
public function getSource()
{
return $this->source;
}
}

View file

@ -46,9 +46,16 @@ class WarrantySerial
*/
protected $source;
// other information
/**
* @ORM\Column(type="json")
*/
protected $meta_info;
public function __construct()
{
$this->date_create = new DateTime();
$this->meta_info = [];
}
public function setID($id)
@ -99,4 +106,19 @@ class WarrantySerial
{
return $this->source;
}
public function addMetaInfo($id, $value)
{
$this->meta_info[$id] = $value;
return $this;
}
public function getMetaInfo($id)
{
// return null if we don't have it
if (!isset($this->meta_info[$id]))
return null;
return $this->meta_info[$id];
}
}

140
src/Ramcar/HubCriteria.php Normal file
View file

@ -0,0 +1,140 @@
<?php
namespace App\Ramcar;
use CrEOF\Spatial\PHP\Types\Geometry\Point;
use DateTime;
class HubCriteria
{
protected $point; // coordinates of source
protected $limit_results; // number of results to return
protected $limit_distance; // distance limit for search in km
protected $flag_inventory_check; // flag if we need to check for inventory
protected $jo_type; // jo service needed
protected $date_time; // date and time to check if hub is open or not
protected $items; // array of items: items[sku] = quantity to check for
protected $payment_method; // payment method of JO
protected $flag_emergency; // flag if emergency or not
public function __construct()
{
// TODO: default values might still change
$this->limit_results = 10;
$this->limit_distance = 500;
$this->jo_type = '';
$this->date_time = null;
$this->flag_inventory_check = false;
$this->items = [];
$this->payment_method = '';
$flag_emergency = false;
}
public function setPoint(Point $point)
{
$this->point = $point;
return $this;
}
public function getPoint()
{
return $this->point;
}
public function setLimitResults($limit_results)
{
$this->limit_results = $limit_results;
return $this;
}
public function getLimitResults()
{
return $this->limit_results;
}
public function setLimitDistance($limit_distance)
{
$this->limit_distance = $limit_distance;
return $this;
}
public function getLimitDistance()
{
return $this->limit_distance;
}
public function setInventoryCheck($flag_inventory_check = true)
{
$this->flag_inventory_check = $flag_inventory_check;
return $this;
}
public function hasInventoryCheck()
{
return $this->flag_inventory_check;
}
public function setJoType($jo_type)
{
// TODO: validate the jo type
$this->jo_type = $jo_type;
return $this;
}
public function getJoType()
{
return $this->jo_type;
}
public function setDateTime(DateTime $date_time)
{
$this->date_time = $date_time;
return $this;
}
public function getDateTime()
{
return $this->date_time;
}
public function addItem($sku, $quantity)
{
// at this point, sku is assumed to be a valid item
$this->items[$sku] = $quantity;
return $this;
}
public function getItems()
{
return $this->items;
}
public function setItems($items)
{
$this->items = $items;
return $this;
}
public function setPaymentMethod($payment_method)
{
$this->payment_method = $payment_method;
return $this;
}
public function getPaymentMethod()
{
return $this->payment_method;
}
public function setEmergency($flag_emergency = true)
{
$this->flag_emergency = $flag_emergency;
return $this;
}
public function isEmergency()
{
return $this->flag_emergency;
}
}

View file

@ -0,0 +1,22 @@
<?php
namespace App\Ramcar;
class WarrantySource extends NameValue
{
const CAPI = 'capi';
const RAPI = 'rapi';
const ADMIN_PANEL = 'admin_panel';
const BULK_UPLOAD = 'bulk_upload';
const MOBILE = 'mobile';
const COMMAND = 'command';
const COLLECTION = [
'capi' => 'Third Party API',
'rapi' => 'Rider API',
'admin_panel' => 'Admin Panel',
'bulk_upload' => 'Bulk Upload',
'mobile' => 'Mobile API',
'command' => 'Command',
];
}

View file

@ -0,0 +1,109 @@
<?php
namespace App\Service;
use App\Service\RedisClientProvider;
use App\Entity\Hub;
class HubDistributor
{
protected $redis;
protected $hub_jo_key;
public function __construct(RedisClientProvider $redis, $hub_jo_key)
{
$this->redis = $redis->getRedisClient();
$this->hub_jo_key = $hub_jo_key;
}
public function incrementJoCountForHub(Hub $hub)
{
$key = $hub->getID();
// get current count
$jo_count = $this->redis->hget($this->hub_jo_key, $key);
if ($jo_count == false)
{
// hub not in hash
// add hub to hash
// set to 1 since this is first jo for hub
$this->redis->hset($this->hub_jo_key, $key, 1);
}
else
{
// hub exist in hash
// add to count
$this->redis->hset($this->hub_jo_key, $key, $jo_count + 1);
}
}
public function decrementJoCountForHub(Hub $hub)
{
$key = $hub->getID();
// get current count
$jo_count = $this->redis->hget($this->hub_jo_key, $key);
if ($jo_count)
{
// hub exist in hash
// decrement count
$this->redis->hset($this->hub_jo_key, $key, $jo_count - 1);
}
}
public function arrangeHubs($hubs)
{
if (count($hubs) == 1)
return $hubs;
$arranged_hubs = [];
foreach ($hubs as $hub_data)
{
$hub = $hub_data['hub'];
// need the id of hub
$key = $hub->getID();
// get jo count of hub
$hub_jo_count = $this->redis->hget($this->hub_jo_key, $key);
// check if hub is in hash. if not, hub has no jobs
// but should still be added to results
if ($hub_jo_count != null)
{
$arranged_hubs[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
'jo_count' => $hub_jo_count,
];
}
else
{
$arranged_hubs[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
'jo_count' => 0,
];
}
}
usort($arranged_hubs, function($a, $b) {
if ($a['jo_count'] == $b['jo_count'])
return 0;
if ($a['jo_count'] < $b['jo_count'])
return -1;
else
return 1;
});
//error_log('arranged hubs ' . json_encode($arranged_hubs));
return $arranged_hubs;
}
}

View file

@ -0,0 +1,29 @@
<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Hub;
use App\Entity\HubFilterLog;
class HubFilterLogger
{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function logFilteredHub(Hub $hub, $filter_type)
{
$hub_filter_log = new HubFilterLog();
$hub_filter_log->setHub($hub)
->setFilterTypeId($filter_type);
$this->em->persist($hub_filter_log);
$this->em->flush();
}
}

479
src/Service/HubSelector.php Normal file
View file

@ -0,0 +1,479 @@
<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use CrEOF\Spatial\PHP\Types\Geometry\Point;
use App\Entity\Hub;
use App\Service\HubDistributor;
use App\Service\InventoryManager;
use App\Service\HubFilterLogger;
use App\Service\RisingTideGateway;
use App\Ramcar\HubCriteria;
use App\Ramcar\ServiceType;
class HubSelector
{
protected $em;
protected $im;
protected $hub_distributor;
protected $hub_filter_logger;
protected $trans;
protected $rt;
public function __construct(EntityManagerInterface $em, InventoryManager $im,
HubDistributor $hub_distributor, HubFilterLogger $hub_filter_logger,
TranslatorInterface $trans, RisingTideGateway $rt)
{
$this->em = $em;
$this->im = $im;
$this->hub_distributor = $hub_distributor;
$this->hub_filter_logger = $hub_filter_logger;
$this->trans = $trans;
$this->rt = $rt;
}
public function find(HubCriteria $criteria)
{
$point = $criteria->getPoint();
$limit_results = $criteria->getLimitResults();
$limit_distance = $criteria->getLimitDistance();
$jo_type = $criteria->getJoType();
$flag_inventory_check = $criteria->hasInventoryCheck();
$items = $criteria->getItems();
$date_time = $criteria->getDateTime();
$payment_method = $criteria->getPaymentMethod();
$flag_emergency = $criteria->isEmergency();
$results = [];
// get all the hubs within distance
$filtered_hubs = $this->getClosestHubs($point, $limit_distance);
//error_log('closest hubs ' . json_encode($filtered_hubs));
if (!$flag_emergency)
{
// filter the first hub results for date and opening times
$hubs_date_time = $this->filterHubsByDateAndTime($filtered_hubs, $date_time);
$filtered_hubs = $hubs_date_time;
// filter jo types
$hubs_jo_type = $this->filterHubsByJoType($filtered_hubs, $jo_type);
$filtered_hubs = $hubs_jo_type;
// filter hubs by payment methods
$hubs_payment_method = $this->filterHubsByPaymentMethod($filtered_hubs, $payment_method);
$filtered_hubs = $hubs_payment_method;
// filter hubs by rider availability
$hubs_rider_availability = $this->filterHubsByRiderAvailability($filtered_hubs);
$filtered_hubs = $hubs_rider_availability;
// inventory filter
$hubs_inventory = $this->filterHubsByInventory($filtered_hubs, $flag_inventory_check,
$jo_type, $items);
$filtered_hubs = $hubs_inventory;
// round robin filter
$hubs_round_robin = $this->filterHubsByRoundRobin($filtered_hubs);
$filtered_hubs = $hubs_round_robin;
//error_log(json_encode($filtered_hubs));
// max results filter
$hubs_max_result = $this->filterHubsByMaxResults($filtered_hubs, $limit_results);
$filtered_hubs = $hubs_max_result;
}
$results = $filtered_hubs;
error_log(json_encode($results));
return $results;
}
protected function filterHubsByRoundRobin($hubs)
{
if (empty($hubs))
return $hubs;
$results = [];
// call hub distributor service
$arranged_hubs = $this->hub_distributor->arrangeHubs($hubs);
$results = $arranged_hubs;
return $results;
}
protected function filterHubsByMaxResults($hubs, $limit_result)
{
if (empty($hubs))
return $hubs;
if (empty($limit_result))
return $hubs;
$results = [];
for ($i = 0; $i < count($hubs); $i++)
{
if ($i < $limit_result)
$results[] = $hubs[$i];
else
$this->hub_filter_logger->logFilteredHub($hubs[$i]['hub'], 'max_results');
}
return $results;
}
protected function filterHubsByJoType($hubs, $jo_type)
{
if (empty($hubs))
return $hubs;
if (empty($jo_type))
return $hubs;
$results = [];
foreach ($hubs as $hub_data)
{
$hub = $hub_data['hub'];
// TODO: for now, have this return true
$has_jo_type = true;
// check if hub offers the jo_type
// TODO: add service to hub
if ($has_jo_type)
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
else
$this->hub_filter_logger->logFilteredHub($hub, 'job_order_type');
}
return $results;
}
protected function filterHubsByPaymentMethod($hubs, $payment_method)
{
if (empty($hubs))
return $hubs;
if (empty($payment_method))
return $hubs;
$results = [];
foreach ($hubs as $hub_data)
{
$hub = $hub_data['hub'];
// name of payment method is what is saved
$payment_methods = $hub->getPaymentMethods();
if ($payment_methods != null)
{
$flag_found_pmethod = false;
foreach ($payment_methods as $pmethod)
{
if ($pmethod == $payment_method)
{
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
}
$flag_found_pmethod = true;
}
if (!$flag_found_pmethod)
$this->hub_filter_logger->logFilteredHub($hub, 'no_payment_method');
}
else
$this->hub_filter_logger->logFilteredHub($hub, 'no_payment_method');
}
return $results;
}
protected function filterHubsByRiderAvailability($hubs)
{
if (empty($hubs))
return $hubs;
$results = [];
foreach ($hubs as $hub_data)
{
$hub = $hub_data['hub'];
// get hub's riders
$riders = $hub->getRiders();
$avail_rider_count = 0;
foreach ($riders as $rider)
{
if ($rider->isAvailable())
$avail_rider_count = $avail_rider_count + 1;
}
error_log('HUB ' . $hub->getID() . ' RIDER COUNT' . $avail_rider_count);
if ($avail_rider_count > 0)
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
else
$this->hub_filter_logger->logFilteredHub($hub, 'no_available_rider');
}
return $results;
}
protected function filterHubsByDateAndTime($hubs, $date_time)
{
if (empty($hubs))
return $hubs;
if ($date_time == null)
return $hubs;
$results = [];
foreach ($hubs as $hub_data)
{
// go through each hub's opening times to check if hub is open
// for the specified time
// get hub opening and closing times
// TODO: maybe in the future, might also have to check if hub
// is open/available on date/day
$hub = $hub_data['hub'];
$time_open = $hub->getTimeOpen()->format("H:i:s");
$time_close = $hub->getTimeClose()->format("H:i:s");
$filter_time = $date_time->format("H:i:s");
if (($filter_time >= $time_open) &&
($filter_time <= $time_close))
{
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
}
else
$this->hub_filter_logger->logFilteredHub($hub, 'date_and_time');
}
return $results;
}
protected function filterHubsByInventory($hubs, $flag_inventory_check, $jo_type, $items)
{
if (empty($hubs))
return $hubs;
if (!$flag_inventory_check)
return $hubs;
$results = [];
if ($flag_inventory_check)
{
foreach ($hubs as $hub_data)
{
$hub = $hub_data['hub'];
if ($jo_type == ServiceType::BATTERY_REPLACEMENT_NEW)
{
// call inventory
$has_items = $this->checkInventory($items, $hub);
if ($has_items)
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
else
{
// get the skus for the message
$sku_text = '';
foreach ($items as $key => $value)
{
$sku_text .= ' ' . $key;
}
// send SMS to hub
$message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message'));
error_log($message);
$this->sendSMSMessage($hub, $items);
$this->hub_filter_logger->logFilteredHub($hub, 'no_inventory');
}
}
if ($jo_type == ServiceType::BATTERY_REPLACEMENT_WARRANTY)
{
// call inventory
$has_items = $this->checkInventory($items, $hub);
if ($has_items)
$results[] = [
'hub' => $hub,
'db_distance' => $hub_data['db_distance'],
'distance' => $hub_data['distance'],
'duration' => $hub_data['duration'],
];
else
{
// get the skus for the message
$sku_text = '';
foreach ($items as $key => $value)
{
$sku_text .= ' ' . $key;
}
// send SMS to hub
$message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message'));
error_log($message);
$this->sendSMSMessage($hub, $items);
$this->hub_filter_logger->logFilteredHub($hub, 'no_inventory');
}
}
}
}
return $results;
}
protected function sendSMSMessage($hub, $items)
{
// compose message
// get the skus for the message
$sku_text = '';
foreach ($items as $key => $value)
{
$sku_text .= ' ' . $key;
}
$message = str_replace('item_display', trim($sku_text), $this->trans->trans('no_inventory_message'));
// get hub notification number
$number = $hub->getNotifNumber();
if (!empty($number))
{
// send SMS message
$mobile_number = '63' . $number;
error_log('sending sms to - ' . $mobile_number);
$this->rt->sendSMS($mobile_number, 'MOTOLITE', $message);
}
}
protected function getClosestHubs(Point $point, $limit_distance)
{
// get closest hubs based on st_distance function from db
$query_string = 'SELECT h, st_distance(h.coordinates, point(:lng, :lat)) as dist FROM App\Entity\Hub h WHERE h.status_open = true ORDER BY dist';
$query = $this->em->createQuery($query_string)
->setParameter('lat', $point->getLatitude())
->setParameter('lng', $point->getLongitude());
// error_log($query->getSql());
$result = $query->getResult();
$hubs = [];
$hubs_data = [];
foreach ($result as $row)
{
$hubs[] = $row[0];
// get coordinates of hub
$hub_coordinates = $row[0]->getCoordinates();
$cust_lat = $point->getLatitude();
$cust_lng = $point->getLongitude();
$hub_lat = $hub_coordinates->getLatitude();
$hub_lng = $hub_coordinates->getLongitude();
// get distance in kilometers from customer point to hub point
$dist = $this->distance($cust_lat, $cust_lng, $hub_lat, $hub_lng);
if ($dist < $limit_distance)
{
$hubs_data[] = [
'hub' => $row[0],
'db_distance' => $row['dist'],
'distance' => $dist,
'duration' => 0,
];
}
else
{
$this->hub_filter_logger->logFilteredHub($row[0], 'distance');
}
}
return $hubs_data;
}
protected function checkInventory($items, $hub)
{
// check if hub has all items
$skus = [];
$branch_codes[] = $hub->getBranchCode();
$result = false;
foreach ($items as $key=> $value)
{
// add sap code of item/battery into array since
// getBranchesInventory takes in an array of hubs/branches
// and an array of skus
// $items as format: $items[sku] = quantity
$skus[] = $key;
}
// call InventoryManager's getBranchesInventory to check if hub has all items
$branches_with_items = $this->im->getBranchesInventory($branch_codes, $skus);
if (!empty($branches_with_items))
{
// check if branch has enough quantity for item
foreach ($branches_with_items as $branch)
{
// get quantity from call
$qty_available = $branch['Quantity'];
// get the quantity request
$sku_requested = $branch['SapCode'];
$qty_requested = $items[$sku_requested];
if ($qty_available >= $qty_requested)
$result = true;
}
}
// return true or false
return $result;
}
// convert db distance to kilometers
protected function distance($lat1, $lon1, $lat2, $lon2)
{
if (($lat1 == $lat2) && ($lon1 == $lon2))
return 0;
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
return round(($miles * 1.609344), 1);
}
}

View file

@ -71,6 +71,7 @@ class InventoryManager
// check if the response is empty
$results = [];
//error_log($response);
if (!empty($response))
$results = json_decode($response, true);

View file

@ -40,6 +40,8 @@ use App\Ramcar\JORejectionReason;
use App\Ramcar\CustomerNotWaitReason;
use App\Ramcar\NoTradeInReason;
use App\Ramcar\WillingToWaitContent;
use App\Ramcar\HubCriteria;
use App\Ramcar\WarrantySource;
use App\Service\InvoiceGeneratorInterface;
use App\Service\JobOrderHandlerInterface;
@ -49,6 +51,8 @@ use App\Service\MQTTClient;
use App\Service\APNSClient;
use App\Service\MapTools;
use App\Service\RisingTideGateway;
use App\Service\HubSelector;
use App\Service\HubDistributor;
use CrEOF\Spatial\PHP\Types\Geometry\Point;
@ -70,13 +74,15 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
protected $country_code;
protected $wh;
protected $rt;
protected $hub_dist;
protected $template_hash;
public function __construct(Security $security, EntityManagerInterface $em,
InvoiceGeneratorInterface $ic, ValidatorInterface $validator,
TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah,
string $country_code, WarrantyHandler $wh, RisingTideGateway $rt)
string $country_code, WarrantyHandler $wh, RisingTideGateway $rt,
HubDistributor $hub_dist)
{
$this->em = $em;
$this->ic = $ic;
@ -87,6 +93,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
$this->country_code = $country_code;
$this->wh = $wh;
$this->rt = $rt;
$this->hub_dist = $hub_dist;
$this->loadTemplates();
}
@ -755,6 +762,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
'event' => 'outlet_assign'
];
$mclient->sendEvent($obj, $payload);
// update redis hub jo count
$this->hub_dist->incrementJoCountForHub($hub);
}
return $error_array;
@ -1016,7 +1026,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
}
}
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class);
$user_id = $user->getUsername();
$source = WarrantySource::ADMIN_PANEL;
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source);
}
else
error_log('Invalid plate number for warranty. Plate number = ' . $obj->getCustomerVehicle()->getPlateNumber());
@ -1124,6 +1136,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
$more_reason = $req->request->get('not_wait_notes');
}
// get previously assigned hub, if any
$old_hub = $obj->getHub();
if (empty($error_array))
{
// rider mqtt event
@ -1197,6 +1212,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
'event' => 'outlet_assign'
];
$mclient->sendEvent($obj, $payload);
// update redis hub_jo_count for hub
// decrement old hub's count and increment new hub's count
if ($old_hub != null)
$this->hub_dist->decrementJoCountForHub($old_hub);
if ($hub != null)
$this->hub_dist->incrementJoCountForHub($hub);
}
return $error_array;
@ -1632,6 +1654,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
return $params;
}
// CMB code
public function initializeOneStepEditForm($id, $map_tools)
{
$em = $this->em;
@ -1812,7 +1835,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
}
// initialize dispatch/processing job order form
public function initializeProcessingForm($id, $map_tools, $motiv)
public function initializeProcessingForm($id, HubSelector $hub_selector, $motiv)
{
$em = $this->em;
@ -1878,8 +1901,44 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
// get rejection reasons
$params['rejection_reasons'] = JORejectionReason::getCollection();
// get battery (if any)
$skus = [];
$items = [];
$invoice = $obj->getInvoice();
$inv_items = $invoice->getItems();
foreach ($inv_items as $inv_item)
{
$batt = $inv_item->getBattery();
if ($batt == null)
continue;
$skus[] = $batt->getSapCode();
$item_count = 1;
if (!empty($batt->getSapCode()))
{
$sap_code = $batt->getSapCode();
if (isset($items[$sap_code]))
$items[$sap_code] = $item_count + 1;
else
$items[$sap_code] = $item_count;
}
}
// get closest hubs
$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s"));
// set hub criteria
$hub_criteria = new HubCriteria();
$hub_criteria->setPoint($obj->getCoordinates())
->setLimitResults(50)
->setPaymentMethod($obj->getModeOfPayment())
->setJoType($obj->getServiceType());
// check if emergency or not
$willing_to_wait = $obj->getWillWait();
if ($willing_to_wait == WillingToWaitContent::NOT_WILLING_TO_WAIT)
$hub_criteria->setEmergency(true);
$hubs = $hub_selector->find($hub_criteria);
//$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s"));
$params['hubs'] = [];
@ -1946,19 +2005,6 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
// get template to display
$params['template'] = $this->getTwigTemplate('jo_processing_form');
// get battery (if any)
$skus = [];
$invoice = $obj->getInvoice();
$inv_items = $invoice->getItems();
foreach ($inv_items as $inv_item)
{
$batt = $inv_item->getBattery();
if ($batt == null)
continue;
$skus[] = $batt->getSapCode();
}
// get inventory
$mres = $motiv->getInventory($branch_codes, $skus);
foreach ($mres as $mres_item)
@ -2103,7 +2149,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
}
// initialize hub form
public function initializeHubForm($id, $map_tools)
public function initializeHubForm($id, HubSelector $hub_selector)
{
$em = $this->em;
@ -2128,7 +2174,11 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
$params['rejection_reasons'] = JORejectionReason::getCollection();
// get closest hubs
$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s"));
$hub_criteria = new HubCriteria();
$hub_criteria->setPoint($obj->getCoordinates())
->setLimitResults(50);
$hubs = $hub_selector->find($hub_criteria);
//$hubs = $map_tools->getClosestHubs($obj->getCoordinates(), 50, date("H:i:s"));
$params['status_cancelled'] = JOStatus::CANCELLED;
$params['hubs'] = [];

View file

@ -7,6 +7,7 @@ use Symfony\Component\HttpFoundation\Request;
use App\Service\MQTTClient;
use App\Service\APNSClient;
use App\Service\MapTools;
use App\Service\HubSelector;
use App\Entity\JobOrder;
@ -67,7 +68,7 @@ interface JobOrderHandlerInterface
public function initializeAllForm(int $id);
// initialize dispatch/processing job order form
public function initializeProcessingForm(int $id, MapTools $map_tools, $motiv);
public function initializeProcessingForm(int $id, HubSelector $hub_selector, $motiv);
// initialize assign job order form
public function initializeAssignForm(int $id);
@ -76,7 +77,7 @@ interface JobOrderHandlerInterface
public function initializeFulfillmentForm(int $id);
// initialize hub form
public function initializeHubForm(int $id, MapTools $map_tools);
public function initializeHubForm(int $id, HubSelector $hub_selector);
// initialize rider form
public function initializeRiderForm(int $id);

View file

@ -13,6 +13,7 @@ use App\Ramcar\JOEventType;
use App\Ramcar\InvoiceStatus;
use App\Ramcar\ModeOfPayment;
use App\Ramcar\InvoiceCriteria;
use App\Ramcar\WarrantySource;
use App\Service\RiderAPIHandlerInterface;
use App\Service\RedisClientProvider;
@ -598,7 +599,10 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface
}
}
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class);
// for riders, use rider session id
$user_id = $this->session->getID();
$source = WarrantySource::RAPI;
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source);
}
// send mqtt event (fulfilled)

View file

@ -83,4 +83,28 @@ class RisingTideGateway
error_log($result);
}
public function validatePhoneNumber($mobile)
{
// check valid number
$num = trim($mobile);
// should be 10 digits
if (strlen($num) != 10)
return false;
// should start with '9'
if ($num[0] != '9')
return false;
// should be numeric
if (!is_numeric($num))
return false;
// should not be 9900000000
if ($num == '9900000000')
return false;
return true;
}
}

View file

@ -0,0 +1,35 @@
<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\WarrantyAPILog;
class WarrantyAPILogger
{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function logWarrantyInfo($log_data, $error, $user_id, $action, $source)
{
$log_entry = new WarrantyAPILog();
$err_aray = [];
$err_array[] = $error;
$log_entry->setApiUser($user_id)
->setErrors($err_array)
->setAllData($log_data)
->setAction($action)
->setSource($source);
$this->em->persist($log_entry);
$this->em->flush();
}
}

View file

@ -11,6 +11,8 @@ use App\Entity\SAPBattery;
use App\Entity\BatteryModel;
use App\Entity\CustomerVehicle;
use App\Service\WarrantyAPILogger;
use App\Ramcar\WarrantyClass;
use DateTime;
@ -19,18 +21,23 @@ use DateInterval;
class WarrantyHandler
{
protected $em;
protected $logger;
public function __construct(EntityManagerInterface $em)
public function __construct(EntityManagerInterface $em, WarrantyAPILogger $logger)
{
$this->em = $em;
$this->logger = $logger;
}
public function createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number,
$batt_list, DateTime $date_purchase, $warranty_class)
$batt_list, DateTime $date_purchase, $warranty_class, $user_id, $source)
{
// new warranty
$warranty = new Warranty();
$bmodel_name = '';
$bsize_name ='';
$sap_batt_id = '';
foreach ($batt_list as $battery)
{
// get the battery model and battery size
@ -43,10 +50,12 @@ class WarrantyHandler
if ($bty_model != null)
{
$warranty->setBatteryModel($bty_model);
$bmodel_name = $bty_model->getName();
}
if ($bty_size != null)
{
$warranty->setBatterySize($bty_size);
$bsize_name = $bty_size->getName();
}
$sap_code = $battery->getSAPCode();
@ -57,6 +66,7 @@ class WarrantyHandler
if ($sap_battery != null)
{
$warranty->setSAPBattery($sap_battery);
$sap_batt_id = $sap_battery->getID();
}
}
}
@ -87,6 +97,22 @@ class WarrantyHandler
$this->em->persist($warranty);
$this->em->flush();
// log warranty creation
$action = 'create';
$log_data = [
'serial' => $serial,
'warranty_class' => $warranty_class,
'first_name' => $first_name,
'last_name' => $last_name,
'mobile_number' => $mobile_number,
'date_purchase' => $date_purchase->format('d-M-y'),
'date_expire' => $date_expire->format('d-M-y'),
'battery_model' => $bmodel_name,
'battery_size' => $bsize_name,
'sap_battery' => $sap_batt_id,
'plate_number' => $plate_number,
];
$this->logger->logWarrantyInfo($log_data, '', $user_id, $action, $source);
// update customer vehicle with warranty info
$this->updateCustomerVehicle($serial, $batt_list, $plate_number, $date_expire);

View file

@ -119,6 +119,9 @@
"microsoft/azure-storage-common": {
"version": "1.5.1"
},
"monolog/monolog": {
"version": "2.2.0"
},
"nikic/php-parser": {
"version": "v4.1.0"
},
@ -188,6 +191,9 @@
"symfony/dependency-injection": {
"version": "v4.0.2"
},
"symfony/deprecation-contracts": {
"version": "v2.4.0"
},
"symfony/doctrine-bridge": {
"version": "v4.0.2"
},
@ -248,6 +254,24 @@
"symfony/mime": {
"version": "v4.3.0"
},
"symfony/monolog-bridge": {
"version": "v5.2.5"
},
"symfony/monolog-bundle": {
"version": "3.7",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "3.7",
"ref": "329f6a5ef2e7aa033f802be833ef8d1268dd0848"
},
"files": [
"config/packages/dev/monolog.yaml",
"config/packages/prod/deprecations.yaml",
"config/packages/prod/monolog.yaml",
"config/packages/test/monolog.yaml"
]
},
"symfony/orm-pack": {
"version": "v1.0.5"
},

View file

@ -90,6 +90,18 @@
<input type="text" name="branch_code" class="form-control m-input" value="{{ obj.getBranchCode() }}">
<div class="form-control-feedback hide" data-field="branch_code"></div>
</div>
<div class="col-lg-6">
<label for="notif_number" data-field="notif_number">
Notification Number
</label>
<div class="input-group m-input-group">
<span class="input-group-addon">{% trans %}country_code_prefix{% endtrans %}</span>
<input type="text" name="notif_number" class="form-control m-input" value="{{ obj.getNotifNumber|default('') }}" data-name="notif_number">
<div class="form-control-feedback hide" data-field="notif_number"></div>
</div>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-3">
<label for="rider_slots" data-field="rider_slots">
Number of Riders Per Slot
@ -142,6 +154,22 @@
</span>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-6">
<label data-field="payment_method">Payment Methods</label>
<div class="m-checkbox-list">
{% for key, value in payment_methods %}
<label class="m-checkbox">
<input type="checkbox" name="payment_methods[]" value="{{ key }}"{{ key in obj.getPaymentMethods ? ' checked' : '' }}>
{{ value }}
<span></span>
</label>
{% endfor %}
</div>
<div class="form-control-feedback hide" data-field="payment_methods"></div>
<span class="m-form__help">Check all payment methods that apply</span>
</div>
</div>
<div class="form-group m-form__group row">
<div class="col-lg-12">
<label>

View file

@ -98,6 +98,7 @@
SAP Battery
</label>
<select name="sap_battery" class="form-control m-input">
<option value=""></option>
{% for sap_battery in sap_batts %}
<option value="{{ sap_battery.getID }}"{{ obj.getSAPBattery.getID|default(0) == sap_battery.getID ? ' selected' }}>{{ sap_battery.getID }}</option>
{% endfor %}
@ -109,6 +110,7 @@
Battery Model
</label>
<select name="battery_model" class="form-control m-input">
<option value=""></option>
{% for model in batt_models %}
<option value="{{ model.getID }}"{{ obj.getBatteryModel.getID|default(0) == model.getID ? ' selected' }}>{{ model.getName }}</option>
{% endfor %}

View file

@ -13,6 +13,7 @@ add_cust_vehicle_battery_info: This vehicle is using a Motolite battery
jo_title_pdf: Motolite Res-Q Job Order
country_code_prefix: '+63'
delivery_instructions_label: Delivery Instructions
no_inventory_message: No stock for [item_display]
# images
image_logo_login: /assets/images/logo-resq.png

View file

@ -0,0 +1,57 @@
<?php
// NOTE: reference: https://github.com/Azure/azure-storage-php/blob/master/samples/BlobSamples.php
require_once(__DIR__ . '/../../vendor/autoload.php');
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Common\ServiceException;
//$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty';
//$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D';
$blob_url = 'https://popappshopprodstorage.blob.core.windows.net';
//$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D';
$sas_token = 'sp=r&st=2021-04-13T03:48:30Z&se=2022-04-01T11:48:30Z&spr=https&sv=2020-02-10&sr=c&sig=L6VDl40qRXhQb7w8JVkj3r7x2Xkt72pQaQ8AH2M5CRk%3D';
$conn_string = "BlobEndpoint=$blob_url;\nSharedAccessSignature=$sas_token";
$blob_client = BlobRestProxy::createBlobService($conn_string);
// get start date from argument: 04-01-21 format
$start_date = $argv[1];
$current_date = new DateTime();
$end_date = $current_date->format('m-d-y');
$flag_done_processing = false;
$proc_date = $start_date;
while (!$flag_done_processing) {
$filename = 'warrantylogs' . $proc_date . '.csv';
echo $filename, PHP_EOL;
try {
// NOTE: via download blob
$res = $blob_client->getBlob('warranty', $filename);
// print_r($res);
file_put_contents("/tmp/output.txt", $res->getContentStream(), FILE_APPEND);
} catch (Exception $e)
{
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// change proc_date to next day
$next_date = DateTime::createFromFormat('m-d-y', $proc_date);
$next_date->modify('+1 day');
$proc_date = $next_date->format('m-d-y');
if ($end_date == $proc_date) {
$flag_done_processing = true;
}
}

View file

@ -0,0 +1,52 @@
<?php
// NOTE: reference: https://github.com/Azure/azure-storage-php/blob/master/samples/BlobSamples.php
require_once(__DIR__ . '/../../vendor/autoload.php');
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Common\ServiceException;
//$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty';
//$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D';
$blob_url = 'https://popappshopprodstorage.blob.core.windows.net';
//$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D';
$sas_token = 'sp=r&st=2021-04-13T03:48:30Z&se=2022-04-01T11:48:30Z&spr=https&sv=2020-02-10&sr=c&sig=L6VDl40qRXhQb7w8JVkj3r7x2Xkt72pQaQ8AH2M5CRk%3D';
$conn_string = "BlobEndpoint=$blob_url;\nSharedAccessSignature=$sas_token";
$blob_client = BlobRestProxy::createBlobService($conn_string);
$current_date = new DateTime();
$current_date->modify("-1 day");
$date = $current_date->format('m-d-y');
$filename = 'warrantylogs' . $date . '.csv';
//print_r($filename);
try {
// NOTE: via download blob
$res = $blob_client->getBlob('warranty', $filename);
// print_r($res);
file_put_contents("/tmp/output.txt", $res->getContentStream());
} catch (Exception $e) {
file_put_contents("/tmp/serial_download_error.txt", $filename . "\n" . $e->getMessage() . "\n" . "\n", FILE_APPEND);
}
/*
// NOTE: getting via url
echo $blob_client->getPsrPrimaryUri() . "\n";
$url = $blob_client->getPsrPrimaryUri() . '?' . $sas_token;
$url = $blob_url . '?' . $sas_token;
file_put_contents('output.txt', fopen($url, 'r'));
*/

View file

@ -10,7 +10,7 @@ $pass = $argv[4];
$db = new PDO($dsn, $user, $pass);
// prepared statement
$sth = $db->prepare('insert into warranty_serial (id, sku, date_create, source) values (:serial, :sku, :date_create, :source)');
$sth = $db->prepare('insert into warranty_serial (id, sku, date_create, source, meta_info) values (:serial, :sku, :date_create, :source, :meta_info)');
// go through rows
@ -25,16 +25,41 @@ while (($row = fgetcsv($csv)) !== false)
continue;
}
/*
$serial = trim(strtoupper($row[0]));
$sku = trim($row[1]);
$date_create = $row[2];
$ref_id = $row[3];
$ref_id = $row[3]; */
// sample of line in output file:
// serial number, sku, dispatch status, created date, inventory status, category id, category name
// CH2000012071,WCHD23BL-CPN00-LX,0,2020-08-11 04:05:27.090,0,4,CHAMPION MF
$serial = trim(strtoupper($row[0]));
$sku = trim($row[1]);
$dispatch_status = trim($row[2]);
$date_create = $row[3];
$inventory_status = trim($row[4]);
$cat_id = trim($row[5]);
$cat_name = trim($row[6]);
$meta_info = [
'dispatch_status' => $dispatch_status,
'inventory_status' => $inventory_status,
'category_id' => $cat_id,
'category_name' => $cat_name,
];
$info = json_encode($meta_info);
if ($sku == 'N/A')
$sku = null;
$res = $sth->execute([
':serial' => $serial,
':sku' => $sku,
':date_create' => $date_create,
':source' => $source
':source' => $source,
':meta_info' => $info,
]);
if (!$res)

View file

@ -1,11 +1,204 @@
DispatcheDate,Sku,SerialNumber
2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202004
2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202005
2020-08-07 05:32:04.537,WMGL23DL-CPNMB-L,MGS706202006
2020-08-08 09:27:14.480,WMXX26EL-CPN00-LX,MXS808202001
2020-08-08 09:31:48.737,WMXX26EL-CPN00-LX,MXS808202002
2020-08-08 10:27:08.117,WMXX26EL-CPN00-LX,MXS808202003
2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202004
2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202005
2020-08-08 10:41:10.060,WMXX26EL-CPN00-LX,MXS808202006
2020-10-05 13:53:57.000,ECHD26AL-SPN00-LX,CH2000012625
PV1000240341,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00
PV1000240344,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00
PV1000240335,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00
PV1000240345,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00
PV1000240338,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00
PV1000240340,N/A,Dispatch,In,2021-04-12T01:12:16.5930000+08:00
PV1000240337,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00
PV1000240334,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00
PV1000240330,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00
PV1000240342,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00
PV1000240343,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00
PV1000240336,N/A,Dispatch,In,2021-04-12T01:12:16.5630000+08:00
PV1000240339,N/A,Dispatch,In,2021-04-12T01:12:16.5470000+08:00
PV1000240332,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00
PV1000240333,N/A,Dispatch,In,2021-04-12T01:12:16.6100000+08:00
PV1000240324,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00
PV1000240326,N/A,Dispatch,In,2021-04-12T01:12:16.5770000+08:00
MX2000056889,N/A,Dispatch,In,2021-04-12T02:58:37.8900000+08:00
MX2000056874,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00
MX2000056888,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00
MX2000056887,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00
MX2000056881,N/A,Dispatch,In,2021-04-12T02:58:37.9070000+08:00
MX2000056880,N/A,Dispatch,In,2021-04-12T02:58:37.9230000+08:00
MX2000056879,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00
MX2000056886,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00
MX2000056890,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00
MX2000056885,N/A,Dispatch,In,2021-04-12T02:58:37.9370000+08:00
MG3102419196,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00
MG3102419202,N/A,Dispatch,In,2021-04-12T02:58:38.2330000+08:00
MG3102419197,N/A,Dispatch,In,2021-04-12T02:58:38.2330000+08:00
MG3102419203,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00
MG3102419198,N/A,Dispatch,In,2021-04-12T02:58:38.2200000+08:00
PV1000225903,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00
PV1000225928,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00
PV1000225905,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225909,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00
PV1000225918,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00
PV1000225911,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00
PV1000225933,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00
PV1000225939,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00
PV1000225940,N/A,Dispatch,In,2021-04-11T23:45:21.2030000+08:00
PV1000225934,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00
PV1000225916,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00
PV1000225915,N/A,Dispatch,In,2021-04-11T23:45:21+08:00
PV1000225937,N/A,Dispatch,In,2021-04-11T23:45:21+08:00
PV1000225929,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00
PV1000225906,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00
PV1000225938,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00
PV1000225902,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00
PV1000225914,N/A,Dispatch,In,2021-04-11T23:45:21+08:00
PV1000225932,N/A,Dispatch,In,2021-04-11T23:45:21+08:00
PV1000225908,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00
PV1000225907,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00
PV1000225910,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225917,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00
PV1000225921,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00
PV1000225913,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225919,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00
PV1000225935,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00
PV1000225900,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00
PV1000225904,N/A,Dispatch,In,2021-04-11T23:45:21.1100000+08:00
PV1000225931,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00
PV1000225897,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00
PV1000225901,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225930,N/A,Dispatch,In,2021-04-11T23:45:21.2030000+08:00
PV1000225926,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00
PV1000225898,N/A,Dispatch,In,2021-04-11T23:45:21.0630000+08:00
PV1000225927,N/A,Dispatch,In,2021-04-11T23:45:21.0970000+08:00
PV1000225896,N/A,Dispatch,In,2021-04-11T23:45:21.0330000+08:00
PV1000225924,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00
PV1000225983,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00
PV1000225925,N/A,Dispatch,In,2021-04-11T23:45:21.0170000+08:00
PV1000225985,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00
PV1000225912,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225980,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00
PV1000225982,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00
PV1000225922,N/A,Dispatch,In,2021-04-11T23:45:21.1900000+08:00
PV1000225923,N/A,Dispatch,In,2021-04-11T23:45:21.0800000+08:00
PV1000225984,N/A,Dispatch,In,2021-04-11T23:45:20.9700000+08:00
PV1000225899,N/A,Dispatch,In,2021-04-11T23:45:20.9870000+08:00
PV1000225920,N/A,Dispatch,In,2021-04-11T23:45:21.0500000+08:00
MES215591711,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00
MES215591707,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00
MES215591708,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00
MES215591699,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00
MES215591700,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00
MES215591718,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00
MES215591733,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00
MES215591725,N/A,Dispatch,In,2021-04-11T22:36:44.0600000+08:00
MES215591723,N/A,Dispatch,In,2021-04-11T22:36:44.0930000+08:00
MES215591724,N/A,Dispatch,In,2021-04-11T22:36:44.0930000+08:00
MES215591712,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00
MES215591716,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00
MES215591713,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00
MES215591714,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00
MES215591719,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00
MES215591721,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00
MES215591720,N/A,Dispatch,In,2021-04-11T22:36:44.0300000+08:00
MES215591722,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00
MES215591715,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00
MES215591709,N/A,Dispatch,In,2021-04-11T22:36:44+08:00
MES215591710,N/A,Dispatch,In,2021-04-11T22:36:44+08:00
MES215591704,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00
MES215591706,N/A,Dispatch,In,2021-04-11T22:36:43.9830000+08:00
MES215591698,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00
MES215591705,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00
MES215591732,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00
MES215591731,N/A,Dispatch,In,2021-04-11T22:36:44.0770000+08:00
MES215591717,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00
MES215591727,N/A,Dispatch,In,2021-04-11T22:36:44.0470000+08:00
MES215591695,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00
MES215591701,N/A,Dispatch,In,2021-04-11T22:36:44+08:00
MES215591702,N/A,Dispatch,In,2021-04-11T22:36:44+08:00
MES215591689,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00
MES215591692,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00
MES215591696,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00
MES215591697,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00
MES215591703,N/A,Dispatch,In,2021-04-11T22:36:44+08:00
MES215591690,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00
MES215591693,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00
MES215591681,N/A,Dispatch,In,2021-04-11T22:36:43.8270000+08:00
MES215591683,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00
MES215591687,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00
MES215591686,N/A,Dispatch,In,2021-04-11T22:36:43.9530000+08:00
MES215591688,N/A,Dispatch,In,2021-04-11T22:36:44.0130000+08:00
MES215591685,N/A,Dispatch,In,2021-04-11T22:36:43.8730000+08:00
MES215591682,N/A,Dispatch,In,2021-04-11T22:36:43.8270000+08:00
MES215591684,N/A,Dispatch,In,2021-04-11T22:36:43.8430000+08:00
MES215591691,N/A,Dispatch,In,2021-04-11T22:36:43.8600000+08:00
MES215591694,N/A,Dispatch,In,2021-04-11T22:36:43.9670000+08:00
MG3101407704,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00
MG3101407702,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00
MG3101407703,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00
MG3101407701,N/A,Dispatch,In,2021-04-12T00:39:47.1870000+08:00
MG3101407705,N/A,Dispatch,In,2021-04-12T00:39:47.1700000+08:00
MG2000112754,N/A,Dispatch,In,2021-04-12T00:40:11.3670000+08:00
MX2000067982,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00
MX2000067975,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00
MX2000067983,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00
MX2000067979,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00
MX2000067984,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00
MX2000067972,N/A,Dispatch,In,2021-04-12T00:33:42.3730000+08:00
MX2000067971,N/A,Dispatch,In,2021-04-12T00:33:42.4330000+08:00
MX2000067977,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00
MX2000067981,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00
MX2000067974,N/A,Dispatch,In,2021-04-12T00:33:42.4500000+08:00
MX2000067978,N/A,Dispatch,In,2021-04-12T00:33:42.4670000+08:00
MX2000067989,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00
MX2000067980,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00
MX2000067976,N/A,Dispatch,In,2021-04-12T00:33:42.1830000+08:00
MX2000067973,N/A,Dispatch,In,2021-04-12T00:33:42.2170000+08:00
MX2000067985,N/A,Dispatch,In,2021-04-12T00:33:42.1530000+08:00
MX2000067990,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00
MX2000067987,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00
MX2000067992,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00
MX2000067988,N/A,Dispatch,In,2021-04-12T00:33:41.9330000+08:00
MX2000067986,N/A,Dispatch,In,2021-04-12T00:33:42.1700000+08:00
MX2000068005,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00
MX2000068006,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00
MX2000068010,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00
MX2000067994,N/A,Dispatch,In,2021-04-12T00:33:42.8570000+08:00
MX2000067991,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00
MX2000067995,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00
MX2000067997,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00
MX2000067999,N/A,Dispatch,In,2021-04-12T00:33:42.5730000+08:00
MX2000068003,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00
MX2000068015,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00
MX2000068020,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00
MX2000068028,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00
MX2000068024,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00
MX2000068029,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00
MX2000068026,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00
MX2000068023,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00
MX2000068019,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00
MX2000068018,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00
MX2000068014,N/A,Dispatch,In,2021-04-12T00:33:42.9800000+08:00
MX2000068022,N/A,Dispatch,In,2021-04-12T00:33:42.9330000+08:00
MX2000068017,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00
MX2000068011,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00
MX2000068012,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00
MX2000068008,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00
MX2000068009,N/A,Dispatch,In,2021-04-12T00:33:42.4800000+08:00
MX2000068004,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00
MX2000067993,N/A,Dispatch,In,2021-04-12T00:33:42.5430000+08:00
MX2000068016,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00
MX2000068013,N/A,Dispatch,In,2021-04-12T00:33:42.9670000+08:00
MX2000068025,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00
MX2000068021,N/A,Dispatch,In,2021-04-12T00:33:42.9500000+08:00
MX2000068007,N/A,Dispatch,In,2021-04-12T00:33:42.4970000+08:00
MX2000068002,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00
MX2000068000,N/A,Dispatch,In,2021-04-12T00:33:42.5600000+08:00
MX2000067998,N/A,Dispatch,In,2021-04-12T00:33:42.5270000+08:00
MX2000068001,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00
MX2000067996,N/A,Dispatch,In,2021-04-12T00:33:42.5130000+08:00
MX2000067967,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00
MX2000067969,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00
MX2000067968,N/A,Dispatch,In,2021-04-12T00:33:42.8570000+08:00
MX2000067970,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00
MX2000067965,N/A,Dispatch,In,2021-04-12T00:33:42.8730000+08:00
MX2000067966,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00
MX2000067964,N/A,Dispatch,In,2021-04-12T00:33:42.8870000+08:00
MX2000067963,N/A,Dispatch,In,2021-04-12T00:33:42.9030000+08:00
MX2000068030,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00
MX2000068027,N/A,Dispatch,In,2021-04-12T00:33:42.9200000+08:00

View file

@ -7,20 +7,29 @@ require_once(__DIR__ . '/../../vendor/autoload.php');
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Common\ServiceException;
$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty';
$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D';
//$blob_url = 'https://popappshopprodstorage.blob.core.windows.net/warranty';
//$sas_token = 'sp=r&st=2021-03-18T08:26:36Z&se=2021-04-29T16:26:36Z&spr=https&sv=2020-02-10&sr=c&sig=Rwl3aCNThXEzuPjNB9sTvZzsx84ULDylyS1WtPwgyzg%3D';
$blob_url = 'https://popappshopprodstorage.blob.core.windows.net';
$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D';
//$sas_token = 'sp=r&st=2021-03-20T17:09:13Z&se=2021-04-01T01:09:13Z&spr=https&sv=2020-02-10&sr=c&sig=pU2fxj6eXALfGTTrsmaJ7W0QtdstyR88Xs5lvMJ35xQ%3D';
$sas_token = 'sp=r&st=2021-04-13T03:48:30Z&se=2022-04-01T11:48:30Z&spr=https&sv=2020-02-10&sr=c&sig=L6VDl40qRXhQb7w8JVkj3r7x2Xkt72pQaQ8AH2M5CRk%3D';
$conn_string = "BlobEndpoint=$blob_url;\nSharedAccessSignature=$sas_token";
$blob_client = BlobRestProxy::createBlobService($conn_string);
$current_date = new DateTime();
$current_date->modify("-1 day");
$date = $current_date->format('m-d-Y');
$filename = 'warrantylogs' . $date . '.csv';
//print_r($filename);
// NOTE: via download blob
$res = $blob_client->getBlob('warranty', 'Sample Result.csv');
$res = $blob_client->getBlob('warranty', $filename);
// print_r($res);
file_put_contents("output.txt", $res->getContentStream());