diff --git a/.env b/.env index 79c16c49..8b535fe1 100755 --- a/.env +++ b/.env @@ -66,4 +66,5 @@ DYNAMODB_DEBUG=false DYNAMODB_LOCAL_ENDPOINT=http://localhost:8008 -LAMBDA_ACCESS_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoiZWEyOGRhNjktNTM3Mi00OTNkLThjYzYtNmQ0Y2NlZDk1ZDMwIiwiZW1wbG95ZWVfY29kZSI6IjEyMzEyMyIsIm5hbWUiOiJSYXZpIEd1bGhhbmUiLCJmaXJzdG5hbWUiOiJSYXZpIiwibGFzdG5hbWUiOiJHdWxoYW5lIiwiZW1haWwiOiJyYXZpZ3VsaGFuZTE5ODNAZ21haWwuY29tIiwicGhvbmUiOiI5ODIzNDg4MTM4IiwiZGVzaWduYXRpb24iOiJOU00iLCJoaWVyYXJjaHkiOiJkMzc5YjhiNS00OGMzLTQ2NGUtYTE4ZS1kMmI3ZDk5NTFmNWIiLCJhdmF0YXIiOiJodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8_YmFja2dyb3VuZD1yYW5kb20mbmFtZT1SYXZpIEd1bGhhbmUiLCJwYXJ0aXRpb24iOiJyYXBwb3J0LXJhcHBvcnQiLCJkb21haW4iOiJyYXBwb3J0IiwiYXBwbGljYXRpb24iOiJyYXBwb3J0Iiwicm9sZXMiOlsiMmMyZDE4OGEtNzlhYi00ODZkLTlmMDktM2FmMTZkZTFiNGEyIl0sImdyb3VwcyI6W10sInRlYW1zIjpbIjE2NTAzNDUyNzMtMGY5NzViMTItYTA1YS00MDc3LWFmNWMtZTRiMWQwZTU5NGFkIl0sImFsbF9kYXRhX2FjY2VzcyI6dHJ1ZX0sInBlcm1pc3Npb25zIjpbInJvbGVzX2NyZWF0ZSIsInVzZXJzX2NyZWF0ZSIsInVzZXJzX3VwZGF0ZSIsInVzZXJzX2dldF9hbGwiLCJ1c2Vyc19nZXRfb25lIiwidXNlcnNfZGVsZXRlIiwidXNlcnNfZHJvcGRvd24iLCJ1c2Vyc19wcm9maWxlIiwidXNlcnNfc2F2ZXByb2ZpbGUiLCJyb2xlc191cGRhdGUiLCJyb2xlc19nZXRfYWxsIiwicm9sZXNfZ2V0X29uZSIsInJvbGVzX2RlbGV0ZSIsInJvbGVzX2Ryb3Bkb3duIiwiZ3JvdXBfY3JlYXRlIiwiZ3JvdXBfdXBkYXRlIiwiZ3JvdXBfZ2V0X2FsbCIsImdyb3VwX2dldF9vbmUiLCJncm91cF9kZWxldGUiLCJncm91cF9kcm9wZG93biIsInRlYW1fY3JlYXRlIiwidGVhbV91cGRhdGUiLCJ0ZWFtX2dldF9hbGwiLCJ0ZWFtX2dldF9vbmUiLCJ0ZWFtX2RlbGV0ZSIsInRlYW1fZHJvcGRvd24iLCJ0ZWFtX3BsYXllcl9jcmVhdGUiLCJ0ZWFtX3BsYXllcl91cGRhdGUiLCJ0ZWFtX3BsYXllcl9kZWxldGUiLCJjaGFubmVsX2NyZWF0ZSIsImNoYW5uZWxfdXBkYXRlIiwiY2hhbm5lbF9nZXRfYWxsIiwiY2hhbm5lbF9nZXRfb25lIiwiY2hhbm5lbF9kZWxldGUiLCJjaGFubmVsX2Ryb3Bkb3duIiwiZG9tYWluX2NyZWF0ZSIsImRvbWFpbl91cGRhdGUiLCJkb21haW5fZ2V0X29uZSIsImhpZXJhcmNoeV9jcmVhdGUiLCJoaWVyYXJjaHlfdXBkYXRlIiwiaGllcmFyY2h5X2dldF9hbGwiLCJoaWVyYXJjaHlfZ2V0X29uZSIsImhpZXJhcmNoeV9kZWxldGUiLCJtYWdhemluZV9jcmVhdGUiLCJtYWdhemluZV91cGRhdGUiLCJtYWdhemluZV9nZXRfYWxsIiwibWFnYXppbmVfZ2V0X29uZSIsIm1hZ2F6aW5lX2RlbGV0ZSIsIm1hZ2F6aW5lX2Ryb3Bkb3duIiwibWFnYXppbmVfZGFzaGJvYXJkIiwibWFnX21lZGlhX2NyZWF0ZSIsIm1hZ19tZWRpYV91cGRhdGUiLCJtYWdfbWVkaWFfZ2V0X2FsbCIsIm1hZ19tZWRpYV9nZXRfb25lIiwibWFnX21lZGlhX2RlbGV0ZSIsIm1hZ19tZWRpYV92aWV3c19jcmVhdGUiLCJtYWdfbWVkaWFfdmlld3NfdXBkYXRlIiwibWFnX21lZGlhX3ZpZXdzX2dldF9hbGwiLCJtYWdfbWVkaWFfdmlld3NfZ2V0X29uZSIsIm1hZ19tZWRpYV92aWV3c19kZWxldGUiLCJtYWdfbWVkaWFfbGlrZSIsIm1hZ19tZWRpYV9saWtlcyIsIm1hZ19tZWRpYV9jb21tZW50IiwibWFnX21lZGlhX2NvbW1lbnRzIiwid2FsbG1lc3NhZ2VfY3JlYXRlIiwid2FsbG1lc3NhZ2VfdXBkYXRlIiwid2FsbG1lc3NhZ2VfZ2V0X2FsbCIsIndhbGxtZXNzYWdlX2dldF9vbmUiLCJ3YWxsbWVzc2FnZV9kZWxldGUiLCJ3YWxsbWVzc2FnZV9saWtlIiwid2FsbG1lc3NhZ2VfbGlrZXMiLCJ3YWxsbWVzc2FnZV9jb21tZW50Iiwid2FsbG1lc3NhZ2VfY29tbWVudHMiLCJ3YWxsYmFubmVyX2NyZWF0ZSIsIndhbGxiYW5uZXJfdXBkYXRlIiwid2FsbGJhbm5lcl9nZXRfYWxsIiwid2FsbGJhbm5lcl9nZXRfb25lIiwid2FsbGJhbm5lcl9kZWxldGUiLCJ3YWxsYmFubmVyX2Rhc2hib2FyZCIsIm1ldHJpY19jcmVhdGUiLCJtZXRyaWNfdXBkYXRlIiwibWV0cmljX2dldF9hbGwiLCJtZXRyaWNfZ2V0X29uZSIsIm1ldHJpY19kZWxldGUiLCJpbmplc3Rpb25fbWFwcGluZ19jcmVhdGUiLCJpbmplc3Rpb25fbWFwcGluZ191cGRhdGUiLCJpbmplc3Rpb25fbWFwcGluZ19nZXRfYWxsIiwiaW5qZXN0aW9uX21hcHBpbmdfZ2V0X29uZSIsImluamVzdGlvbl9tYXBwaW5nX2RlbGV0ZSIsIm1ldHJpY19pbmplc3QiLCJtZXRyaWNfdmlld19jcmVhdGUiLCJtZXRyaWNfdmlld191cGRhdGUiLCJtZXRyaWNfdmlld19nZXRfYWxsIiwibWV0cmljX3ZpZXdfZ2V0X29uZSIsIm1ldHJpY192aWV3X2RlbGV0ZSIsIm1hZ2F6aW5lX2xpc3QiLCJtYWdhemluZV9kZXRhaWxzIiwibWFnX21lZGlhX2RldGFpbHMiLCJ3YWxsbWVzc2FnZV9saXN0Iiwid2FsbG1lc3NhZ2VfZGV0YWlscyIsIm1ldHJpY19yZXBvcnRfbGlzdCIsIm1ldHJpY19yZXBvcnRfdmlldyIsImFwcHJlY2lhdGlvbl9jYXRlZ29yeV9jcmVhdGUiLCJhcHByZWNpYXRpb25fY2F0ZWdvcnlfdXBkYXRlIiwiYXBwcmVjaWF0aW9uX2NhdGVnb3J5X2dldF9hbGwiLCJhcHByZWNpYXRpb25fY2F0ZWdvcnlfZ2V0X29uZSIsImFwcHJlY2lhdGlvbl9jYXRlZ29yeV9kZWxldGUiLCJhcHByZWNpYXRpb25faW1hZ2VfY3JlYXRlIiwiYXBwcmVjaWF0aW9uX2ltYWdlX3VwZGF0ZSIsImFwcHJlY2lhdGlvbl9pbWFnZV9nZXRfYWxsIiwiYXBwcmVjaWF0aW9uX2ltYWdlX2dldF9vbmUiLCJhcHByZWNpYXRpb25faW1hZ2VfZGVsZXRlIiwiYmFkZ2VfbGlzdF9jcmVhdGUiLCJiYWRnZV9saXN0X3VwZGF0ZSIsImJhZGdlX2xpc3RfZ2V0X2FsbCIsImJhZGdlX2xpc3RfZ2V0X29uZSIsImJhZGdlX2xpc3RfZGVsZXRlIiwicmV3YXJkX2NyZWF0ZSIsInJld2FyZF91cGRhdGUiLCJyZXdhcmRfZ2V0X2FsbCIsInJld2FyZF9nZXRfb25lIiwicmV3YXJkX2RlbGV0ZSIsInJld2FyZF9jYXRlZ29yeV9jcmVhdGUiLCJyZXdhcmRfY2F0ZWdvcnlfdXBkYXRlIiwicmV3YXJkX2NhdGVnb3J5X2dldF9hbGwiLCJyZXdhcmRfY2F0ZWdvcnlfZ2V0X29uZSIsInJld2FyZF9jYXRlZ29yeV9kZWxldGUiLCJyZXdhcmRfb3JkZXJfY3JlYXRlIiwicmV3YXJkX29yZGVyX3VwZGF0ZSIsInJld2FyZF9vcmRlcl9nZXRfYWxsIiwicmV3YXJkX29yZGVyX2dldF9vbmUiLCJyZXdhcmRfb3JkZXJfZGVsZXRlIiwiZm9ybWVudGl0eV9jcmVhdGUiLCJmb3JtZW50aXR5X3VwZGF0ZSIsImZvcm1lbnRpdHlfZ2V0X2FsbCIsImZvcm1lbnRpdHlfZ2V0X29uZSIsImZvcm1lbnRpdHlfZGVsZXRlIiwiZm9ybXF1ZXN0aW9uX2NyZWF0ZSIsImZvcm1xdWVzdGlvbl91cGRhdGUiLCJmb3JtcXVlc3Rpb25fZ2V0X2FsbCIsImZvcm1xdWVzdGlvbl9nZXRfb25lIiwiZm9ybXF1ZXN0aW9uX2RlbGV0ZSIsImZvcm1hY3Rpb25fY3JlYXRlIiwiZm9ybWFjdGlvbl91cGRhdGUiLCJmb3JtYWN0aW9uX2dldF9hbGwiLCJmb3JtYWN0aW9uX2dldF9vbmUiLCJmb3JtYWN0aW9uX2RlbGV0ZSIsImZvcm1hY3Rpb25fbGlzdCIsImZvcm1lbnRpdHlfYXBwcm92YWwiLCJmb3JtZW50aXR5X2FwcHJvdmVyZWplY3QiLCJjb250YWN0X2NyZWF0ZSIsImNvbnRhY3RfdXBkYXRlIiwiY29udGFjdF9nZXRfYWxsIiwiY29udGFjdF9nZXRfb25lIiwiY29udGFjdF9kZWxldGUiLCJjb250YWN0YXR0cmlidXRlX2NyZWF0ZSIsImNvbnRhY3RhdHRyaWJ1dGVfdXBkYXRlIiwiY29udGFjdGF0dHJpYnV0ZV9nZXRfYWxsIiwiY29udGFjdGF0dHJpYnV0ZV9nZXRfb25lIiwiY29udGFjdGF0dHJpYnV0ZV9kZWxldGUiLCJmb3JtcHJvZHVjdF9jcmVhdGUiLCJmb3JtcHJvZHVjdF91cGRhdGUiLCJmb3JtcHJvZHVjdF9nZXRfYWxsIiwiZm9ybXByb2R1Y3RfZ2V0X29uZSIsImZvcm1wcm9kdWN0X2RlbGV0ZSIsIm5vdGlmaWNhdGlvbl9saXN0IiwicmVtaW5kZXJfY3JlYXRlIiwicmVtaW5kZXJfdXBkYXRlIiwicmVtaW5kZXJfZ2V0X2FsbCIsInJlbWluZGVyX2dldF9vbmUiLCJyZW1pbmRlcl9kZWxldGUiLCJ3aWRnZXRzX2NyZWF0ZSIsIndpZGdldHNfdXBkYXRlIiwid2lkZ2V0c19nZXRfYWxsIiwid2lkZ2V0c19nZXRfb25lIiwid2lkZ2V0c19kZWxldGUiLCJhbGxfZGF0YV9hY2Nlc3MiLCJmb3JtZXhwb3J0c19jcmVhdGUiLCJmb3JtZXhwb3J0c191cGRhdGUiLCJmb3JtZXhwb3J0c19nZXRfYWxsIiwiZm9ybWV4cG9ydHNfZ2V0X29uZSIsImZvcm1leHBvcnRzX2RlbGV0ZSIsImNvbnRlc3RfY3JlYXRlIiwiY29udGVzdF91cGRhdGUiLCJjb250ZXN0X2dldF9hbGwiLCJjb250ZXN0X2dldF9vbmUiLCJjb250ZXN0X2RlbGV0ZSIsImNvbnRlc3RfZGFzaGJvYXJkIiwiY29udGVzdF9saXN0IiwiY29udGVzdF9kZXRhaWxzIiwiY29udGVzdF9yZXNwb25zZV9yZWNvcmQiLCJwYXJhbWV0ZXJfY3JlYXRlIiwicGFyYW1ldGVyX3VwZGF0ZSIsInBhcmFtZXRlcl9nZXRfYWxsIiwicGFyYW1ldGVyX2dldF9vbmUiLCJwYXJhbWV0ZXJfZGVsZXRlIiwiY29udGVzdF9yZXNwb25zZV9jcmVhdGUiLCJjb250ZXN0X3Jlc3BvbnNlX3VwZGF0ZSIsImNvbnRlc3RfcmVzcG9uc2VfZ2V0X2FsbCIsImNvbnRlc3RfcmVzcG9uc2VfZ2V0X29uZSIsImNvbnRlc3RfcmVzcG9uc2VfZGVsZXRlIiwicGVyc29uYWxpemF0aW9uX2NyZWF0ZSIsInBlcnNvbmFsaXphdGlvbl91cGRhdGUiLCJwZXJzb25hbGl6YXRpb25fZ2V0X2FsbCIsInBlcnNvbmFsaXphdGlvbl9nZXRfb25lIiwicGVyc29uYWxpemF0aW9uX2RlbGV0ZSIsInN1cnZleV9jcmVhdGUiLCJzdXJ2ZXlfdXBkYXRlIiwic3VydmV5X2dldF9hbGwiLCJzdXJ2ZXlfZ2V0X29uZSIsInN1cnZleV9kZWxldGUiLCJzdXJ2ZXlxdWVzdGlvbl9jcmVhdGUiLCJzdXJ2ZXlxdWVzdGlvbl91cGRhdGUiLCJzdXJ2ZXlxdWVzdGlvbl9nZXRfYWxsIiwic3VydmV5cXVlc3Rpb25fZ2V0X29uZSIsInN1cnZleXF1ZXN0aW9uX2RlbGV0ZSIsImNhbXBhaWduX2NyZWF0ZSIsImNhbXBhaWduX3VwZGF0ZSIsImNhbXBhaWduX2dldF9hbGwiLCJjYW1wYWlnbl9nZXRfb25lIiwiY2FtcGFpZ25fZGVsZXRlIiwiY2FtcGFpZ25ydWxlX2NyZWF0ZSIsImNhbXBhaWducnVsZV91cGRhdGUiLCJjYW1wYWlnbnJ1bGVfZ2V0X2FsbCIsImNhbXBhaWducnVsZV9nZXRfb25lIiwiY2FtcGFpZ25ydWxlX2RlbGV0ZSIsInF1aXpfY3JlYXRlIiwicXVpel91cGRhdGUiLCJxdWl6X2dldF9hbGwiLCJxdWl6X2dldF9vbmUiLCJxdWl6X2RlbGV0ZSIsInF1aXpxdWVzdGlvbl9jcmVhdGUiLCJxdWl6cXVlc3Rpb25fdXBkYXRlIiwicXVpenF1ZXN0aW9uX2dldF9hbGwiLCJxdWl6cXVlc3Rpb25fZ2V0X29uZSIsInF1aXpxdWVzdGlvbl9kZWxldGUiLCJicmFuZF9jcmVhdGUiLCJicmFuZF91cGRhdGUiLCJicmFuZF9nZXRfYWxsIiwiYnJhbmRfZ2V0X29uZSIsImJyYW5kX2RlbGV0ZSIsInByb2R1Y3RfY3JlYXRlIiwicHJvZHVjdF91cGRhdGUiLCJwcm9kdWN0X2dldF9hbGwiLCJwcm9kdWN0X2dldF9vbmUiLCJwcm9kdWN0X2RlbGV0ZSIsInByb2R1Y3RhdHRyaWJ1dGVfY3JlYXRlIiwicHJvZHVjdGF0dHJpYnV0ZV91cGRhdGUiLCJwcm9kdWN0YXR0cmlidXRlX2dldF9hbGwiLCJwcm9kdWN0YXR0cmlidXRlX2dldF9vbmUiLCJwcm9kdWN0YXR0cmlidXRlX2RlbGV0ZSJdLCJyb2xlcyI6WyIyYzJkMTg4YS03OWFiLTQ4NmQtOWYwOS0zYWYxNmRlMWI0YTIiXSwiaWF0IjoxNjk4NzI5ODYyLCJleHAiOjE2OTkzMzQ2NjJ9.ad6kzvocsPcSl108Hjh1YYgbTBfWrWVix9y4eKLojTM" \ No newline at end of file +LAMBDA_ACCESS_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoiZWEyOGRhNjktNTM3Mi00OTNkLThjYzYtNmQ0Y2NlZDk1ZDMwIiwiZW1wbG95ZWVfY29kZSI6IjEyMzEyMyIsIm5hbWUiOiJSYXZpIEd1bGhhbmUiLCJmaXJzdG5hbWUiOiJSYXZpIiwibGFzdG5hbWUiOiJHdWxoYW5lIiwiZW1haWwiOiJyYXZpZ3VsaGFuZTE5ODNAZ21haWwuY29tIiwicGhvbmUiOiI5ODIzNDg4MTM4IiwiZGVzaWduYXRpb24iOiJOU00iLCJoaWVyYXJjaHkiOiJkMzc5YjhiNS00OGMzLTQ2NGUtYTE4ZS1kMmI3ZDk5NTFmNWIiLCJhdmF0YXIiOiJodHRwczovL3VpLWF2YXRhcnMuY29tL2FwaS8_YmFja2dyb3VuZD1yYW5kb20mbmFtZT1SYXZpIEd1bGhhbmUiLCJwYXJ0aXRpb24iOiJyYXBwb3J0LXJhcHBvcnQiLCJkb21haW4iOiJyYXBwb3J0IiwiYXBwbGljYXRpb24iOiJyYXBwb3J0Iiwicm9sZXMiOlsiMmMyZDE4OGEtNzlhYi00ODZkLTlmMDktM2FmMTZkZTFiNGEyIl0sImdyb3VwcyI6W10sInRlYW1zIjpbIjE2NTAzNDUyNzMtMGY5NzViMTItYTA1YS00MDc3LWFmNWMtZTRiMWQwZTU5NGFkIl0sImFsbF9kYXRhX2FjY2VzcyI6dHJ1ZX0sInBlcm1pc3Npb25zIjpbInJvbGVzX2NyZWF0ZSIsInVzZXJzX2NyZWF0ZSIsInVzZXJzX3VwZGF0ZSIsInVzZXJzX2dldF9hbGwiLCJ1c2Vyc19nZXRfb25lIiwidXNlcnNfZGVsZXRlIiwidXNlcnNfZHJvcGRvd24iLCJ1c2Vyc19wcm9maWxlIiwidXNlcnNfc2F2ZXByb2ZpbGUiLCJyb2xlc191cGRhdGUiLCJyb2xlc19nZXRfYWxsIiwicm9sZXNfZ2V0X29uZSIsInJvbGVzX2RlbGV0ZSIsInJvbGVzX2Ryb3Bkb3duIiwiZ3JvdXBfY3JlYXRlIiwiZ3JvdXBfdXBkYXRlIiwiZ3JvdXBfZ2V0X2FsbCIsImdyb3VwX2dldF9vbmUiLCJncm91cF9kZWxldGUiLCJncm91cF9kcm9wZG93biIsInRlYW1fY3JlYXRlIiwidGVhbV91cGRhdGUiLCJ0ZWFtX2dldF9hbGwiLCJ0ZWFtX2dldF9vbmUiLCJ0ZWFtX2RlbGV0ZSIsInRlYW1fZHJvcGRvd24iLCJ0ZWFtX3BsYXllcl9jcmVhdGUiLCJ0ZWFtX3BsYXllcl91cGRhdGUiLCJ0ZWFtX3BsYXllcl9kZWxldGUiLCJjaGFubmVsX2NyZWF0ZSIsImNoYW5uZWxfdXBkYXRlIiwiY2hhbm5lbF9nZXRfYWxsIiwiY2hhbm5lbF9nZXRfb25lIiwiY2hhbm5lbF9kZWxldGUiLCJjaGFubmVsX2Ryb3Bkb3duIiwiZG9tYWluX2NyZWF0ZSIsImRvbWFpbl91cGRhdGUiLCJkb21haW5fZ2V0X29uZSIsImhpZXJhcmNoeV9jcmVhdGUiLCJoaWVyYXJjaHlfdXBkYXRlIiwiaGllcmFyY2h5X2dldF9hbGwiLCJoaWVyYXJjaHlfZ2V0X29uZSIsImhpZXJhcmNoeV9kZWxldGUiLCJtYWdhemluZV9jcmVhdGUiLCJtYWdhemluZV91cGRhdGUiLCJtYWdhemluZV9nZXRfYWxsIiwibWFnYXppbmVfZ2V0X29uZSIsIm1hZ2F6aW5lX2RlbGV0ZSIsIm1hZ2F6aW5lX2Ryb3Bkb3duIiwibWFnYXppbmVfZGFzaGJvYXJkIiwibWFnX21lZGlhX2NyZWF0ZSIsIm1hZ19tZWRpYV91cGRhdGUiLCJtYWdfbWVkaWFfZ2V0X2FsbCIsIm1hZ19tZWRpYV9nZXRfb25lIiwibWFnX21lZGlhX2RlbGV0ZSIsIm1hZ19tZWRpYV92aWV3c19jcmVhdGUiLCJtYWdfbWVkaWFfdmlld3NfdXBkYXRlIiwibWFnX21lZGlhX3ZpZXdzX2dldF9hbGwiLCJtYWdfbWVkaWFfdmlld3NfZ2V0X29uZSIsIm1hZ19tZWRpYV92aWV3c19kZWxldGUiLCJtYWdfbWVkaWFfbGlrZSIsIm1hZ19tZWRpYV9saWtlcyIsIm1hZ19tZWRpYV9jb21tZW50IiwibWFnX21lZGlhX2NvbW1lbnRzIiwid2FsbG1lc3NhZ2VfY3JlYXRlIiwid2FsbG1lc3NhZ2VfdXBkYXRlIiwid2FsbG1lc3NhZ2VfZ2V0X2FsbCIsIndhbGxtZXNzYWdlX2dldF9vbmUiLCJ3YWxsbWVzc2FnZV9kZWxldGUiLCJ3YWxsbWVzc2FnZV9saWtlIiwid2FsbG1lc3NhZ2VfbGlrZXMiLCJ3YWxsbWVzc2FnZV9jb21tZW50Iiwid2FsbG1lc3NhZ2VfY29tbWVudHMiLCJ3YWxsYmFubmVyX2NyZWF0ZSIsIndhbGxiYW5uZXJfdXBkYXRlIiwid2FsbGJhbm5lcl9nZXRfYWxsIiwid2FsbGJhbm5lcl9nZXRfb25lIiwid2FsbGJhbm5lcl9kZWxldGUiLCJ3YWxsYmFubmVyX2Rhc2hib2FyZCIsIm1ldHJpY19jcmVhdGUiLCJtZXRyaWNfdXBkYXRlIiwibWV0cmljX2dldF9hbGwiLCJtZXRyaWNfZ2V0X29uZSIsIm1ldHJpY19kZWxldGUiLCJpbmplc3Rpb25fbWFwcGluZ19jcmVhdGUiLCJpbmplc3Rpb25fbWFwcGluZ191cGRhdGUiLCJpbmplc3Rpb25fbWFwcGluZ19nZXRfYWxsIiwiaW5qZXN0aW9uX21hcHBpbmdfZ2V0X29uZSIsImluamVzdGlvbl9tYXBwaW5nX2RlbGV0ZSIsIm1ldHJpY19pbmplc3QiLCJtZXRyaWNfdmlld19jcmVhdGUiLCJtZXRyaWNfdmlld191cGRhdGUiLCJtZXRyaWNfdmlld19nZXRfYWxsIiwibWV0cmljX3ZpZXdfZ2V0X29uZSIsIm1ldHJpY192aWV3X2RlbGV0ZSIsIm1hZ2F6aW5lX2xpc3QiLCJtYWdhemluZV9kZXRhaWxzIiwibWFnX21lZGlhX2RldGFpbHMiLCJ3YWxsbWVzc2FnZV9saXN0Iiwid2FsbG1lc3NhZ2VfZGV0YWlscyIsIm1ldHJpY19yZXBvcnRfbGlzdCIsIm1ldHJpY19yZXBvcnRfdmlldyIsImFwcHJlY2lhdGlvbl9jYXRlZ29yeV9jcmVhdGUiLCJhcHByZWNpYXRpb25fY2F0ZWdvcnlfdXBkYXRlIiwiYXBwcmVjaWF0aW9uX2NhdGVnb3J5X2dldF9hbGwiLCJhcHByZWNpYXRpb25fY2F0ZWdvcnlfZ2V0X29uZSIsImFwcHJlY2lhdGlvbl9jYXRlZ29yeV9kZWxldGUiLCJhcHByZWNpYXRpb25faW1hZ2VfY3JlYXRlIiwiYXBwcmVjaWF0aW9uX2ltYWdlX3VwZGF0ZSIsImFwcHJlY2lhdGlvbl9pbWFnZV9nZXRfYWxsIiwiYXBwcmVjaWF0aW9uX2ltYWdlX2dldF9vbmUiLCJhcHByZWNpYXRpb25faW1hZ2VfZGVsZXRlIiwiYmFkZ2VfbGlzdF9jcmVhdGUiLCJiYWRnZV9saXN0X3VwZGF0ZSIsImJhZGdlX2xpc3RfZ2V0X2FsbCIsImJhZGdlX2xpc3RfZ2V0X29uZSIsImJhZGdlX2xpc3RfZGVsZXRlIiwicmV3YXJkX2NyZWF0ZSIsInJld2FyZF91cGRhdGUiLCJyZXdhcmRfZ2V0X2FsbCIsInJld2FyZF9nZXRfb25lIiwicmV3YXJkX2RlbGV0ZSIsInJld2FyZF9jYXRlZ29yeV9jcmVhdGUiLCJyZXdhcmRfY2F0ZWdvcnlfdXBkYXRlIiwicmV3YXJkX2NhdGVnb3J5X2dldF9hbGwiLCJyZXdhcmRfY2F0ZWdvcnlfZ2V0X29uZSIsInJld2FyZF9jYXRlZ29yeV9kZWxldGUiLCJyZXdhcmRfb3JkZXJfY3JlYXRlIiwicmV3YXJkX29yZGVyX3VwZGF0ZSIsInJld2FyZF9vcmRlcl9nZXRfYWxsIiwicmV3YXJkX29yZGVyX2dldF9vbmUiLCJyZXdhcmRfb3JkZXJfZGVsZXRlIiwiZm9ybWVudGl0eV9jcmVhdGUiLCJmb3JtZW50aXR5X3VwZGF0ZSIsImZvcm1lbnRpdHlfZ2V0X2FsbCIsImZvcm1lbnRpdHlfZ2V0X29uZSIsImZvcm1lbnRpdHlfZGVsZXRlIiwiZm9ybXF1ZXN0aW9uX2NyZWF0ZSIsImZvcm1xdWVzdGlvbl91cGRhdGUiLCJmb3JtcXVlc3Rpb25fZ2V0X2FsbCIsImZvcm1xdWVzdGlvbl9nZXRfb25lIiwiZm9ybXF1ZXN0aW9uX2RlbGV0ZSIsImZvcm1hY3Rpb25fY3JlYXRlIiwiZm9ybWFjdGlvbl91cGRhdGUiLCJmb3JtYWN0aW9uX2dldF9hbGwiLCJmb3JtYWN0aW9uX2dldF9vbmUiLCJmb3JtYWN0aW9uX2RlbGV0ZSIsImZvcm1hY3Rpb25fbGlzdCIsImZvcm1lbnRpdHlfYXBwcm92YWwiLCJmb3JtZW50aXR5X2FwcHJvdmVyZWplY3QiLCJjb250YWN0X2NyZWF0ZSIsImNvbnRhY3RfdXBkYXRlIiwiY29udGFjdF9nZXRfYWxsIiwiY29udGFjdF9nZXRfb25lIiwiY29udGFjdF9kZWxldGUiLCJjb250YWN0YXR0cmlidXRlX2NyZWF0ZSIsImNvbnRhY3RhdHRyaWJ1dGVfdXBkYXRlIiwiY29udGFjdGF0dHJpYnV0ZV9nZXRfYWxsIiwiY29udGFjdGF0dHJpYnV0ZV9nZXRfb25lIiwiY29udGFjdGF0dHJpYnV0ZV9kZWxldGUiLCJmb3JtcHJvZHVjdF9jcmVhdGUiLCJmb3JtcHJvZHVjdF91cGRhdGUiLCJmb3JtcHJvZHVjdF9nZXRfYWxsIiwiZm9ybXByb2R1Y3RfZ2V0X29uZSIsImZvcm1wcm9kdWN0X2RlbGV0ZSIsIm5vdGlmaWNhdGlvbl9saXN0IiwicmVtaW5kZXJfY3JlYXRlIiwicmVtaW5kZXJfdXBkYXRlIiwicmVtaW5kZXJfZ2V0X2FsbCIsInJlbWluZGVyX2dldF9vbmUiLCJyZW1pbmRlcl9kZWxldGUiLCJ3aWRnZXRzX2NyZWF0ZSIsIndpZGdldHNfdXBkYXRlIiwid2lkZ2V0c19nZXRfYWxsIiwid2lkZ2V0c19nZXRfb25lIiwid2lkZ2V0c19kZWxldGUiLCJhbGxfZGF0YV9hY2Nlc3MiLCJmb3JtZXhwb3J0c19jcmVhdGUiLCJmb3JtZXhwb3J0c191cGRhdGUiLCJmb3JtZXhwb3J0c19nZXRfYWxsIiwiZm9ybWV4cG9ydHNfZ2V0X29uZSIsImZvcm1leHBvcnRzX2RlbGV0ZSIsImNvbnRlc3RfY3JlYXRlIiwiY29udGVzdF91cGRhdGUiLCJjb250ZXN0X2dldF9hbGwiLCJjb250ZXN0X2dldF9vbmUiLCJjb250ZXN0X2RlbGV0ZSIsImNvbnRlc3RfZGFzaGJvYXJkIiwiY29udGVzdF9saXN0IiwiY29udGVzdF9kZXRhaWxzIiwiY29udGVzdF9yZXNwb25zZV9yZWNvcmQiLCJwYXJhbWV0ZXJfY3JlYXRlIiwicGFyYW1ldGVyX3VwZGF0ZSIsInBhcmFtZXRlcl9nZXRfYWxsIiwicGFyYW1ldGVyX2dldF9vbmUiLCJwYXJhbWV0ZXJfZGVsZXRlIiwiY29udGVzdF9yZXNwb25zZV9jcmVhdGUiLCJjb250ZXN0X3Jlc3BvbnNlX3VwZGF0ZSIsImNvbnRlc3RfcmVzcG9uc2VfZ2V0X2FsbCIsImNvbnRlc3RfcmVzcG9uc2VfZ2V0X29uZSIsImNvbnRlc3RfcmVzcG9uc2VfZGVsZXRlIiwicGVyc29uYWxpemF0aW9uX2NyZWF0ZSIsInBlcnNvbmFsaXphdGlvbl91cGRhdGUiLCJwZXJzb25hbGl6YXRpb25fZ2V0X2FsbCIsInBlcnNvbmFsaXphdGlvbl9nZXRfb25lIiwicGVyc29uYWxpemF0aW9uX2RlbGV0ZSIsInN1cnZleV9jcmVhdGUiLCJzdXJ2ZXlfdXBkYXRlIiwic3VydmV5X2dldF9hbGwiLCJzdXJ2ZXlfZ2V0X29uZSIsInN1cnZleV9kZWxldGUiLCJzdXJ2ZXlxdWVzdGlvbl9jcmVhdGUiLCJzdXJ2ZXlxdWVzdGlvbl91cGRhdGUiLCJzdXJ2ZXlxdWVzdGlvbl9nZXRfYWxsIiwic3VydmV5cXVlc3Rpb25fZ2V0X29uZSIsInN1cnZleXF1ZXN0aW9uX2RlbGV0ZSIsImNhbXBhaWduX2NyZWF0ZSIsImNhbXBhaWduX3VwZGF0ZSIsImNhbXBhaWduX2dldF9hbGwiLCJjYW1wYWlnbl9nZXRfb25lIiwiY2FtcGFpZ25fZGVsZXRlIiwiY2FtcGFpZ25ydWxlX2NyZWF0ZSIsImNhbXBhaWducnVsZV91cGRhdGUiLCJjYW1wYWlnbnJ1bGVfZ2V0X2FsbCIsImNhbXBhaWducnVsZV9nZXRfb25lIiwiY2FtcGFpZ25ydWxlX2RlbGV0ZSIsInF1aXpfY3JlYXRlIiwicXVpel91cGRhdGUiLCJxdWl6X2dldF9hbGwiLCJxdWl6X2dldF9vbmUiLCJxdWl6X2RlbGV0ZSIsInF1aXpxdWVzdGlvbl9jcmVhdGUiLCJxdWl6cXVlc3Rpb25fdXBkYXRlIiwicXVpenF1ZXN0aW9uX2dldF9hbGwiLCJxdWl6cXVlc3Rpb25fZ2V0X29uZSIsInF1aXpxdWVzdGlvbl9kZWxldGUiLCJicmFuZF9jcmVhdGUiLCJicmFuZF91cGRhdGUiLCJicmFuZF9nZXRfYWxsIiwiYnJhbmRfZ2V0X29uZSIsImJyYW5kX2RlbGV0ZSIsInByb2R1Y3RfY3JlYXRlIiwicHJvZHVjdF91cGRhdGUiLCJwcm9kdWN0X2dldF9hbGwiLCJwcm9kdWN0X2dldF9vbmUiLCJwcm9kdWN0X2RlbGV0ZSIsInByb2R1Y3RhdHRyaWJ1dGVfY3JlYXRlIiwicHJvZHVjdGF0dHJpYnV0ZV91cGRhdGUiLCJwcm9kdWN0YXR0cmlidXRlX2dldF9hbGwiLCJwcm9kdWN0YXR0cmlidXRlX2dldF9vbmUiLCJwcm9kdWN0YXR0cmlidXRlX2RlbGV0ZSJdLCJyb2xlcyI6WyIyYzJkMTg4YS03OWFiLTQ4NmQtOWYwOS0zYWYxNmRlMWI0YTIiXSwiaWF0IjoxNjk4NzI5ODYyLCJleHAiOjE2OTkzMzQ2NjJ9.ad6kzvocsPcSl108Hjh1YYgbTBfWrWVix9y4eKLojTM" +TGICS_API_BASE=http://localhost:3050 diff --git a/.env.example b/.env.example index c3ed2a91..5f8bce2c 100755 --- a/.env.example +++ b/.env.example @@ -47,3 +47,6 @@ PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +# TGICS patient survey API (counts for Dr Enrolment form) +TGICS_API_BASE=http://localhost:3050 diff --git a/app/Helpers/TgicsHelper.php b/app/Helpers/TgicsHelper.php new file mode 100644 index 00000000..b5a7846f --- /dev/null +++ b/app/Helpers/TgicsHelper.php @@ -0,0 +1,61 @@ + $contactIds + * @return array{counts: array, total: int} + */ + public static function getSurveyCounts(array $contactIds): array + { + $ids = array_values(array_unique(array_filter(array_map(static function ($id) { + return trim((string) $id); + }, $contactIds)))); + + if (count($ids) === 0) { + return ['counts' => [], 'total' => 0]; + } + + $base = rtrim((string) env('TGICS_API_BASE', ''), '/'); + if ($base === '') { + Log::warning('TGICS_API_BASE is not configured; survey counts defaulting to 0'); + return ['counts' => array_fill_keys($ids, 0), 'total' => 0]; + } + + try { + $response = Http::timeout(8)->acceptJson()->get($base.'/api/surveys/counts', [ + 'contact_ids' => implode(',', $ids), + ]); + + if (!$response->successful()) { + Log::warning('TGICS survey counts request failed', [ + 'status' => $response->status(), + 'body' => $response->body(), + ]); + return ['counts' => array_fill_keys($ids, 0), 'total' => 0]; + } + + $json = $response->json(); + $countsRaw = $json['data']['counts'] ?? []; + $counts = []; + $total = 0; + foreach ($ids as $id) { + $n = (int) ($countsRaw[$id] ?? 0); + $counts[$id] = $n; + $total += $n; + } + + return ['counts' => $counts, 'total' => $total]; + } catch (\Throwable $e) { + Log::error('TGICS survey counts error: '.$e->getMessage()); + return ['counts' => array_fill_keys($ids, 0), 'total' => 0]; + } + } +} diff --git a/app/Http/Controllers/FormController.php b/app/Http/Controllers/FormController.php index 2339ec29..e49d5061 100644 --- a/app/Http/Controllers/FormController.php +++ b/app/Http/Controllers/FormController.php @@ -796,6 +796,164 @@ class FormController extends Controller $formdata->partition = $post['partition']; } + // TGICS (The Great Indian Cough Study) — Dr Enrolment + if ($formdata->form_id == '1792561624-4466e937-cfb5-4679-989a-c3fea892568f') { + if (empty($post['user_id']) && !empty($formdata->user_id)) { + $post['user_id'] = $formdata->user_id; + } + + $wfsaCode = preg_replace('/\D+/', '', (string) ($post['wfsa_code'] ?? '')); + $post['wfsa_code'] = $wfsaCode; + + if ($wfsaCode === '') { + return response()->json([ + 'status' => 'error', + 'message' => 'WFSA code is required.', + 'description' => 'Please enter a valid WFSA code.', + ]); + } + + list($application, $domain) = explode('-', $formdata->partition); + $tokenRows = DB::table('users') + ->select('access_token') + ->where('domain', $domain) + ->where('permissions', 'like', '%contact_create%') + ->orderBy('updated_at', 'desc') + ->skip(0) + ->take(1) + ->get(); + + if ($tokenRows->isEmpty() || empty($tokenRows[0]->access_token)) { + return response()->json([ + 'status' => 'error', + 'message' => 'Unable to validate doctor enrolment.', + 'description' => 'Contact create permission is not available. Please try again later.', + ]); + } + $accessToken = $tokenRows[0]->access_token; + $currentSubmissionId = isset($post['id']) ? (string) $post['id'] : ''; + $linkedContactId = (string) ($post['tgics_contact_id'] ?? ''); + $exists = false; + + $previousEntries = \App\Helpers\Formhelper::getMultiformData( + $formdata->partition, + $formdata->form_id, + $formdata->user_id + ); + + // On edit, keep the existing contact link and resolve it if not posted + if ($currentSubmissionId !== '' && isset($previousEntries->data->submissions) && is_array($previousEntries->data->submissions)) { + foreach ($previousEntries->data->submissions as $submission) { + $submissionId = isset($submission->id) ? (string) $submission->id : ''; + if ($submissionId !== $currentSubmissionId) { + continue; + } + if ($linkedContactId === '' && !empty($submission->formdata->tgics_contact_id)) { + $linkedContactId = (string) $submission->formdata->tgics_contact_id; + $post['tgics_contact_id'] = $linkedContactId; + } + break; + } + } + + $conts = LambdaRequest::getrequest('contact', 'contact/get_all', [ + 'keyword' => $wfsaCode, + 'start' => 0, + 'length' => 10000, + ], $accessToken); + + if (isset($conts->data->items) && is_array($conts->data->items)) { + foreach ($conts->data->items as $item) { + $itemMsl = isset($item->msl_code) ? preg_replace('/\D+/', '', (string) $item->msl_code) : ''; + if ($itemMsl !== '' && strcasecmp($itemMsl, $wfsaCode) === 0) { + $itemId = isset($item->id) ? (string) $item->id : ''; + // On edit, allow the same contact already linked to this enrolment + if ($currentSubmissionId !== '' && $linkedContactId !== '' && $itemId === $linkedContactId) { + continue; + } + $exists = true; + break; + } + } + } + + if (!$exists && isset($previousEntries->data->submissions) && is_array($previousEntries->data->submissions)) { + foreach ($previousEntries->data->submissions as $submission) { + $submissionId = isset($submission->id) ? (string) $submission->id : ''; + if ($currentSubmissionId !== '' && $submissionId === $currentSubmissionId) { + continue; + } + $entryWfsa = isset($submission->formdata->wfsa_code) + ? preg_replace('/\D+/', '', (string) $submission->formdata->wfsa_code) + : ''; + if ($entryWfsa !== '' && $entryWfsa === $wfsaCode) { + $exists = true; + break; + } + } + } + + if ($exists) { + return response()->json([ + 'status' => 'error', + 'message' => 'Doctor with this WFSA code already exists.', + 'description' => 'Please check the enrolled doctor list or use a different WFSA code.', + ]); + } + + // Create contact only on new enrolments (not edits) + if ($currentSubmissionId === '') { + $doctorName = trim((string) ($post['contact_id'] ?? ($post['doctor_name'] ?? ''))); + if ($doctorName === '') { + return response()->json([ + 'status' => 'error', + 'message' => 'Doctor name is required.', + 'description' => 'Please enter the name of the practitioner.', + ]); + } + + $contactdata = [ + 'domain' => $domain, + 'application' => $application, + 'user_id' => $post['user_id'] ?? $formdata->user_id, + 'name' => $doctorName, + 'msl_code' => $wfsaCode, + 'phone' => $post['whatsapp_mobile_number'] ?? '', + 'email' => $post['email_id'] ?? '', + 'type' => 'doctor', + 'tgics_enrolled_doctor' => 'Yes', + ]; + if (!empty($post['age'])) { + $contactdata['age'] = $post['age']; + } + if (!empty($post['city_town'])) { + $contactdata['city'] = $post['city_town']; + } + if (!empty($post['state'])) { + $contactdata['state'] = $post['state']; + } + if (!empty($post['qualification'])) { + $contactdata['qualification'] = $post['qualification']; + } + if (!empty($post['years_of_practice'])) { + $contactdata['years_of_practice'] = $post['years_of_practice']; + } + if (!empty($post['type_of_practice'])) { + $contactdata['type_of_practice'] = $post['type_of_practice']; + } + + $cont = LambdaRequest::postrequest('contact', 'contact/create', $contactdata, $accessToken); + if (!isset($cont->status) || $cont->status !== 'success' || empty($cont->data->item->id)) { + return response()->json([ + 'status' => 'error', + 'message' => 'Unable to create doctor contact.', + 'description' => $cont->message ?? 'Please try again after some time.', + ]); + } + $post['tgics_contact_id'] = $cont->data->item->id; + } + } + if($formdata->form_id == '1740377155-6ef021d0-d8cf-42e6-bc7d-d00743b7b354') { // emcurecv Hospital Enrollment $inputs = $request->input(); list($application, $domain) = explode("-", $formdata->partition); @@ -5684,26 +5842,44 @@ class FormController extends Controller if ($post['status'] != 'Partially Saved') { $post['record_id'] = $insertedId; $finfo = LambdaRequest::postrequest('form', 'formentity/submitform', ['formdata' => $post, 'entity_id' => $formdata->form_id, 'user_id' => $formdata->user_id, 'partition' => $formdata->partition ]); - } - // Get old data before update - $oldData = DB::table('neblogistic')->where('id', $insertedId)->first(); - $oldDataArray = $oldData ? json_decode(json_encode($oldData), true) : null; - - $submissionId = isset($finfo->data->submission->id) ? $finfo->data->submission->id : null; - $abmid = isset($finfo->data->submission->workflow_next_approver) ? $finfo->data->submission->workflow_next_approver : null; - - if ($post['status'] != 'Partially Saved') { - $res = DB::table('neblogistic')->where('id', $insertedId)->update(['submission_id' => $submissionId, 'abm_user_id' => $abmid]); - } - // Log UPDATE operation - if ($res) { + $submissionId = isset($finfo->data->submission->id) ? $finfo->data->submission->id : null; + $abmid = isset($finfo->data->submission->workflow_next_approver) ? $finfo->data->submission->workflow_next_approver : null; + if (!isset($finfo->status) || $finfo->status !== 'success' || empty($submissionId)) { + Log::error('NAP create: Dynamo submitform failed or missing submission id', [ + 'neblogistic_id' => $insertedId, + 'finfo' => $finfo, + ]); + return response()->json([ + 'status' => 'failure', + 'message' => 'Request could not be submitted for approval. Please try again.', + ]); + } + // Get old data before update + $oldData = DB::table('neblogistic')->where('id', $insertedId)->first(); + $oldDataArray = $oldData ? json_decode(json_encode($oldData), true) : null; + DB::table('neblogistic')->where('id', $insertedId)->update(['submission_id' => $submissionId, 'abm_user_id' => $abmid]); + $linked = DB::table('neblogistic') + ->where('id', $insertedId) + ->where('submission_id', $submissionId) + ->exists(); + if (!$linked) { + Log::error('NAP create: failed to link submission_id on neblogistic', [ + 'neblogistic_id' => $insertedId, + 'submission_id' => $submissionId, + ]); + return response()->json([ + 'status' => 'failure', + 'message' => 'Request could not be linked for approval. Please try again.', + ]); + } NeblogisticAuditService::logUpdate( - $insertedId, - $oldDataArray, - ['submission_id' => $submissionId], + $insertedId, + $oldDataArray, + ['submission_id' => $submissionId, 'abm_user_id' => $abmid], ['submission_id' => ['old' => $oldDataArray['submission_id'] ?? null, 'new' => $submissionId]], $request ); + $datatosave['submission_id'] = $submissionId; } Log::debug("Creating Neblogistics"); @@ -7914,7 +8090,35 @@ class FormController extends Controller $this->syncNapMysqlFromApproval($request, $post, $finfo); - return response()->json($post); + if (!isset($finfo->status) || $finfo->status !== 'success') { + $message = is_string($finfo->data ?? null) + ? $finfo->data + : ($finfo->message ?? 'Unable to process approval action.'); + $statusCode = isset($finfo->statusCode) && (int) $finfo->statusCode >= 400 + ? (int) $finfo->statusCode + : 500; + return response()->json([ + 'status' => 'failure', + 'message' => $message, + ], $statusCode); + } + + $payload = [ + 'status' => 'success', + 'action' => $post['action'] ?? '', + 'submission_id' => $post['submission_id'] ?? $post['id'] ?? '', + 'form_id' => $post['form_id'] ?? '', + ]; + if (isset($finfo->data->nap_status)) { + $payload['nap_status'] = $finfo->data->nap_status; + } + if (isset($finfo->data->mysql_synced)) { + $payload['mysql_synced'] = $finfo->data->mysql_synced; + } + if (isset($finfo->data->mysql_id)) { + $payload['mysql_id'] = $finfo->data->mysql_id; + } + return response()->json($payload); } public function approverejectmultiple(Request $request) { @@ -7974,11 +8178,30 @@ class FormController extends Controller } $record = DB::table('neblogistic')->where('submission_id', $submissionId)->first(); + $matchedById = false; if (!$record) { + $recordId = $post['record_id'] + ?? ($response->data->mysql_id ?? null) + ?? ($response->data->record_id ?? null) + ?? null; + if ($recordId !== null && $recordId !== '') { + $record = DB::table('neblogistic')->where('id', $recordId)->first(); + $matchedById = (bool) $record; + } + } + if (!$record) { + Log::warning('NAP sync: no neblogistic row for approval', [ + 'submission_id' => $submissionId, + 'nap_status' => $napStatus, + 'record_id' => $post['record_id'] ?? null, + ]); return; } $update = ['status' => $napStatus]; + if ($matchedById) { + $update['submission_id'] = $submissionId; + } $now = date('Y-m-d H:i:s'); if ($napStatus === 'Rejected') { $update['rejected_at'] = $now; @@ -7993,7 +8216,7 @@ class FormController extends Controller } $old = json_decode(json_encode($record), true); - DB::table('neblogistic')->where('submission_id', $submissionId)->update($update); + DB::table('neblogistic')->where('id', $record->id)->update($update); NeblogisticAuditService::logUpdate($record->id, $old, $update, null, $request); } diff --git a/resources/views/form/rapport-lifemankind/1792561624-4466e937-cfb5-4679-989a-c3fea892568f.blade.php b/resources/views/form/rapport-lifemankind/1792561624-4466e937-cfb5-4679-989a-c3fea892568f.blade.php index a4855089..b6e9ec75 100644 --- a/resources/views/form/rapport-lifemankind/1792561624-4466e937-cfb5-4679-989a-c3fea892568f.blade.php +++ b/resources/views/form/rapport-lifemankind/1792561624-4466e937-cfb5-4679-989a-c3fea892568f.blade.php @@ -47,83 +47,127 @@ $form->form_id, $form->user_id, ); + $tgicsSubmissions = collect($history->data->submissions ?? []); + $doctorsAddedCount = $tgicsSubmissions->count(); + + $tgicsContactIds = $tgicsSubmissions + ->map(function ($countSub) { + return trim((string) ($countSub->formdata->tgics_contact_id ?? '')); + }) + ->filter() + ->unique() + ->values() + ->all(); + + $tgicsSurveyData = \App\Helpers\TgicsHelper::getSurveyCounts($tgicsContactIds); + $tgicsSurveyCounts = $tgicsSurveyData['counts'] ?? []; + $totalSurveysDone = (int) ($tgicsSurveyData['total'] ?? 0); + + $tgicsCommonUserId = trim((string) ($form->user_id ?? '')); + $tgicsCommonLink = $tgicsCommonUserId !== '' + ? 'https://tgics.cttr.in/' . $tgicsCommonUserId + : ''; @endphp - -
- + @if ($tgicsCommonLink !== '') +
+ +
+ + +
+ Common link for all doctors. Doctors enter their WhatsApp number to log in. +
+ @endif +
+
+
+ No. of doctors added + {{ $doctorsAddedCount }} +
+
+
+
+ No. of surveys done + {{ $totalSurveysDone }} +
+
+
- - - + + + - - - - - - - - - - @foreach (collect($history->data->submissions)->sortByDesc('formdata.record_date') as $sub) + @foreach ($tgicsSubmissions->sortByDesc('formdata.record_date') as $sub) @php $sub->formdata->id = $sub->id; - + $workflowStatus = strtolower(trim((string) ($sub->workflow_status ?? ''))); + $isApproved = $workflowStatus === 'approved'; + $whatsappDigits = preg_replace('/\D+/', '', (string) ($sub->formdata->whatsapp_mobile_number ?? '')); + if (strlen($whatsappDigits) === 10) { + $whatsappDigits = '91' . $whatsappDigits; + } + $doctorName = ''; + if (isset($sub->formdata->contact_id) && $sub->formdata->contact_id !== '') { + $doctorName = $sub->formdata->contact_id; + } elseif (isset($sub->formdata->doctor_name)) { + $doctorName = $sub->formdata->doctor_name; + } + $tgicsContactId = trim((string) ($sub->formdata->tgics_contact_id ?? '')); + $rowUserId = trim((string) ($sub->formdata->user_id ?? ($sub->user_id ?? ($form->user_id ?? '')))); + $doctorLink = $rowUserId !== '' + ? 'https://tgics.cttr.in/' . $rowUserId + : $tgicsCommonLink; + $surveysDone = $tgicsContactId !== '' + ? (int) ($tgicsSurveyCounts[$tgicsContactId] ?? 0) + : 0; + $whatsappText = "Dear Doctor" . ($doctorName !== '' ? ' ' . $doctorName : '') . ",\n\nYou have been approved for TGICS (The Great Indian Cough Study).\nPlease open the link and enter your WhatsApp mobile number to continue:\n" . $doctorLink; + $whatsappLink = ($whatsappDigits !== '' && $doctorLink !== '') + ? 'https://api.whatsapp.com/send?phone=' . $whatsappDigits . '&text=' . rawurlencode($whatsappText) + : ''; @endphp - - - - - + + + - - - - - - - - @endforeach @@ -380,6 +424,50 @@ $('#form-wrapper').hide() $('#execution-form-wrapper').hide() + function copyTgicsLink(text) { + if (navigator.clipboard && window.isSecureContext) { + return navigator.clipboard.writeText(text); + } + return new Promise(function(resolve, reject) { + var textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-9999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + var ok = document.execCommand('copy'); + document.body.removeChild(textArea); + ok ? resolve() : reject(); + } catch (err) { + document.body.removeChild(textArea); + reject(err); + } + }); + } + + $(document).on('click', '.btn-copy-tgics-link', function() { + var link = $(this).data('link') || ''; + var $btn = $(this); + if (!link) { + return; + } + copyTgicsLink(link).then(function() { + var original = $btn.html(); + $btn.html(' Copied'); + setTimeout(function() { + $btn.html(original); + }, 1500); + }).catch(function() { + Swal.fire({ + icon: 'error', + title: 'Unable to copy', + text: 'Please copy the link manually.', + }); + }); + }); + // $('#add-camp-btn').click(function() { // $('#form-wrapper').show() // $('#table-wrapper').hide() @@ -462,17 +550,25 @@ title: 'Great!', text: 'Your data is successfully submitted!', icon: 'success' - }) - window.location.reload(); - //$('#report-form').trigger("reset"); + }).then(function() { + window.location.reload(); + }); } else { Swal.fire({ icon: 'error', - title: 'Data not submitted', - text: 'Something went wrong, please try again after some time!' - }) + title: data.message || 'Data not submitted', + text: data.description || data.message || 'Something went wrong, please try again after some time!' + }); } }, + error: function() { + $("#pageloader").fadeOut(); + Swal.fire({ + icon: 'error', + title: 'Data not submitted', + text: 'Something went wrong, please try again after some time!' + }); + } }); }); @@ -565,18 +661,26 @@ title: 'Great!', text: 'Your data is successfully submitted!', icon: 'success' - }).then(() => { - location.reload(); // 🔥 page refresh here - }); - $('#report-form').trigger("reset"); + }).then(function() { + location.reload(); + }); + $('#report-form').trigger("reset"); } else { Swal.fire({ icon: 'error', - title: 'Data not submitted', - text: 'Something went wrong, please try again after some time!' - }) + title: data.message || 'Data not submitted', + text: data.description || data.message || 'Something went wrong, please try again after some time!' + }); } }, + error: function() { + $("#pageloader").fadeOut(); + Swal.fire({ + icon: 'error', + title: 'Data not submitted', + text: 'Something went wrong, please try again after some time!' + }); + } }); }); diff --git a/resources/views/form/rapport-team3/1790230856-a5ff58a6-d509-4ac0-9b18-6d366a74965e-history.blade.php b/resources/views/form/rapport-team3/1790230856-a5ff58a6-d509-4ac0-9b18-6d366a74965e-history.blade.php index dc23febd..88bfd49f 100644 --- a/resources/views/form/rapport-team3/1790230856-a5ff58a6-d509-4ac0-9b18-6d366a74965e-history.blade.php +++ b/resources/views/form/rapport-team3/1790230856-a5ff58a6-d509-4ac0-9b18-6d366a74965e-history.blade.php @@ -92,8 +92,8 @@ @endforeach
Action.ActionWorkflow StatusSurveys Done Name of the PractitionerWFSA Code WhatsApp Mobile Number Email IDAge (in completed years)Years of PracticeType of PracticeCity/TownStateQualificationOther Qualification
- - - @if (isset($sub->formdata->contact_id) && $sub->formdata->contact_id !== '') - {{ $sub->formdata->contact_id }} - @elseif (isset($sub->formdata->doctor_name)) - {{ $sub->formdata->doctor_name }} + @if ($isApproved) + @if ($whatsappLink !== '') + + Send WhatsApp + + @elseif ($doctorLink === '') + Link unavailable + @else + No WhatsApp number + @endif @else - {{-- Default value or empty string, adjust as needed --}} - {{ '' }} + @endif {{ $workflowStatus !== '' ? ucwords($workflowStatus) : '-' }}{{ $surveysDone }}{{ $doctorName }} {{ isset($sub->formdata->wfsa_code) ? $sub->formdata->wfsa_code : '' }} {{ isset($sub->formdata->whatsapp_mobile_number) ? $sub->formdata->whatsapp_mobile_number : '' }} {{ isset($sub->formdata->email_id) ? $sub->formdata->email_id : '' }} {{ isset($sub->formdata->age) ? $sub->formdata->age : '' }} - {{ isset($sub->formdata->years_of_practice) ? $sub->formdata->years_of_practice : '' }} - {{ isset($sub->formdata->type_of_practice) ? $sub->formdata->type_of_practice : '' }} - {{ isset($sub->formdata->city_town) ? $sub->formdata->city_town : '' }} - {{ isset($sub->formdata->state) ? $sub->formdata->state : '' }} - {{ isset($sub->formdata->qualification) ? $sub->formdata->qualification : '' }} - {{ isset($sub->formdata->other_qualification) ? $sub->formdata->other_qualification : '' }} -
- @if(strtolower((string) ($submission->workflow_status ?? '')) !== 'approved') - Edit + @if(strtolower((string) ($submission->workflow_status ?? '')) === 'rejected') + Edit / Re-upload @endif