diff --git a/app/Helpers/TgicsHelper.php b/app/Helpers/TgicsHelper.php index 78fb0be0..c48105f4 100644 --- a/app/Helpers/TgicsHelper.php +++ b/app/Helpers/TgicsHelper.php @@ -95,6 +95,22 @@ class TgicsHelper return strtolower(trim((string) $value)) === 'yes'; } + /** + * Read validation flag from a contact object (supports attribute_ prefix). + */ + public static function contactHasWhatsappValidated($item): bool + { + if (!$item) { + return false; + } + $direct = $item->tgics_whatsapp_validated ?? null; + if (self::isWhatsappValidatedFlag($direct)) { + return true; + } + $prefixed = $item->attribute_tgics_whatsapp_validated ?? null; + return self::isWhatsappValidatedFlag($prefixed); + } + /** * Map contact_id => whether WhatsApp is validated for TGICS. * @@ -122,11 +138,16 @@ class TgicsHelper try { $resp = LambdaRequest::getrequest('contact', 'contact/get_one', ['id' => $id], $accessToken); $item = $resp->data->item ?? null; - if ($item && self::isWhatsappValidatedFlag($item->tgics_whatsapp_validated ?? '')) { - $status[$id] = true; - } + $validated = self::contactHasWhatsappValidated($item); + $status[$id] = $validated; + Log::info('[TGICS_WA_STATUS] contact lookup', [ + 'contact_id' => $id, + 'validated' => $validated, + 'flag' => $item->tgics_whatsapp_validated ?? ($item->attribute_tgics_whatsapp_validated ?? null), + 'api_status' => $resp->status ?? null, + ]); } catch (\Throwable $e) { - Log::warning('TGICS WhatsApp validation lookup failed for '.$id.': '.$e->getMessage()); + Log::warning('[TGICS_WA_STATUS] lookup failed for '.$id.': '.$e->getMessage()); } } diff --git a/app/Http/Controllers/FormController.php b/app/Http/Controllers/FormController.php index e048d53a..d5269226 100644 --- a/app/Http/Controllers/FormController.php +++ b/app/Http/Controllers/FormController.php @@ -1705,6 +1705,43 @@ class FormController extends Controller } } + // Team3 doctor tagging (single submit): mark attribute = Yes on selected doctor(s) + $team3DrTagAttributes = [ + '1793772514-e8e67206-8dba-471e-b08f-deece5d36d11' => 'levoswitch_drs', + '1793767249-069bf040-1469-4117-b364-e4851e1f4bdf' => 'toba_titans_drs', + ]; + if (isset($team3DrTagAttributes[$formdata->form_id])) { + $tagAttribute = $team3DrTagAttributes[$formdata->form_id]; + $rawContactIds = $post['contact_id'] ?? []; + if (!is_array($rawContactIds)) { + $rawContactIds = [$rawContactIds]; + } + $contactIds = []; + foreach ($rawContactIds as $contactId) { + $contactId = trim((string) $contactId); + if ($contactId !== '' && strcasecmp($contactId, 'others') !== 0) { + $contactIds[] = $contactId; + } + } + $contactIds = array_values(array_unique($contactIds)); + if ($contactIds !== [] && !empty($formdata->partition)) { + list($application, $domain) = explode('-', $formdata->partition); + $token = DB::table('users')->select('access_token')->where('domain', $domain)->where('permissions', 'like', '%contact_create%')->orderBy('updated_at', 'desc')->skip(0)->take(1)->get(); + $userId = trim((string) ($post['user_id'] ?? ($formdata->user_id ?? ''))); + if ($token->isNotEmpty() && $userId !== '') { + foreach ($contactIds as $contactId) { + LambdaRequest::postrequest('contact', 'contact/update', [ + 'domain' => $domain, + 'application' => $application, + 'user_id' => $userId, + 'id' => $contactId, + $tagAttribute => 'Yes', + ], $token[0]->access_token); + } + } + } + } + if($formdata->form_id == '1757055046-ba0eff4e-0d4a-4e90-b190-c59f12ef6edd') { // if(isset($post['cresar_bs_launched']) && $post['cresar_bs_launched'] == 'Yes' ) { list($application, $domain) = explode("-", $formdata->partition); @@ -8104,6 +8141,40 @@ class FormController extends Controller ]); } + // Team3 doctor tagging: mark attribute = Yes on each selected doctor + $team3DrTagAttributes = [ + '1793772514-e8e67206-8dba-471e-b08f-deece5d36d11' => 'levoswitch_drs', + '1793767249-069bf040-1469-4117-b364-e4851e1f4bdf' => 'toba_titans_drs', + ]; + if (isset($team3DrTagAttributes[$formdata->form_id])) { + $tagAttribute = $team3DrTagAttributes[$formdata->form_id]; + $contactIds = []; + if (!empty($post['contact_id']) && is_array($post['contact_id'])) { + foreach ($post['contact_id'] as $contactId) { + $contactId = trim((string) $contactId); + if ($contactId !== '' && strcasecmp($contactId, 'others') !== 0) { + $contactIds[] = $contactId; + } + } + } + $contactIds = array_values(array_unique($contactIds)); + if ($contactIds !== [] && !empty($formdata->partition)) { + list($application, $domain) = explode('-', $formdata->partition); + $token = DB::table('users')->select('access_token')->where('domain', $domain)->where('permissions', 'like', '%contact_create%')->orderBy('updated_at', 'desc')->skip(0)->take(1)->get(); + $userId = trim((string) ($post['user_id'] ?? ($formdata->user_id ?? ''))); + if ($token->isNotEmpty() && $userId !== '') { + foreach ($contactIds as $contactId) { + LambdaRequest::postrequest('contact', 'contact/update', [ + 'domain' => $domain, + 'application' => $application, + 'user_id' => $userId, + 'id' => $contactId, + $tagAttribute => 'Yes', + ], $token[0]->access_token); + } + } + } + } if(isset($formdata) && !empty($formdata) && $formdata->user_id != '') { $post = $this->applyPobAmounts($post); @@ -13550,6 +13621,11 @@ class FormController extends Controller } $validated = \App\Helpers\TgicsHelper::isContactWhatsappValidated($contactId, $domain); + \Log::info('[TGICS_WA_STATUS] poll', [ + 'contact_id' => $contactId, + 'domain' => $domain, + 'validated' => $validated, + ]); return response()->json([ 'status' => 'success', 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 e549a444..5edac330 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 @@ -866,41 +866,50 @@ $('body').addClass('modal-open'); } + function checkTgicsWaStatus(contactId) { + return $.ajax({ + type: 'GET', + url: '/form/tgicswhatsappstatus', + data: { + contact_id: contactId, + partition: 'rapport-lifemankind' + } + }).then(function(res) { + if (res && res.status === 'success' && res.data && res.data.validated) { + stopTgicsWaPoll(); + $('#tgics-validate-wa-status').text('Validated!'); + Swal.fire({ + icon: 'success', + title: 'WhatsApp validated', + text: 'You can now send the survey link to this doctor.', + timer: 1800, + showConfirmButton: false + }).then(function() { + window.location.reload(); + }); + return true; + } + return false; + }, function(err) { + console.warn('[TGICS_WA_STATUS] poll failed', err); + return false; + }); + } + function startTgicsWaPoll(contactId) { stopTgicsWaPoll(); tgicsWaPollStartedAt = Date.now(); $('#tgics-validate-wa-status').text('Waiting for validation…'); - + // Immediate check, then every 2s + checkTgicsWaStatus(contactId); tgicsWaPollTimer = setInterval(function() { if (Date.now() - tgicsWaPollStartedAt > 120000) { stopTgicsWaPoll(); $('#tgics-validate-wa-status').text('Still waiting. Close and try Validate again after the doctor sends the message.'); return; } - $.ajax({ - type: 'GET', - url: '/form/tgicswhatsappstatus', - data: { - contact_id: contactId, - partition: 'rapport-lifemankind' - }, - success: function(res) { - if (res && res.status === 'success' && res.data && res.data.validated) { - stopTgicsWaPoll(); - $('#tgics-validate-wa-status').text('Validated!'); - Swal.fire({ - icon: 'success', - title: 'WhatsApp validated', - text: 'You can now send the survey link to this doctor.', - timer: 1800, - showConfirmButton: false - }).then(function() { - window.location.reload(); - }); - } - } - }); - }, 3000); + checkTgicsWaStatus(contactId); + }, 2000); } $(document).on('click', '.tgics-validate-wa-btn', function(e) { diff --git a/resources/views/form/rapport-team3/1793767249-069bf040-1469-4117-b364-e4851e1f4bdf-history.blade.php b/resources/views/form/rapport-team3/1793767249-069bf040-1469-4117-b364-e4851e1f4bdf-history.blade.php new file mode 100644 index 00000000..25d948ae --- /dev/null +++ b/resources/views/form/rapport-team3/1793767249-069bf040-1469-4117-b364-e4851e1f4bdf-history.blade.php @@ -0,0 +1,267 @@ +@php + $multiDoctorFormId = '1793767249-069bf040-1469-4117-b364-e4851e1f4bdf'; + + $isMultiDoctorForm = isset($form->form_id) + && $form->form_id == $multiDoctorFormId; + + $doctorFieldCodes = [ + 'contact_id', + 'legacy_code', + 'msl_code', + 'speciality' + ]; + + $doctorFieldLabels = [ + 'contact_id' => 'HCP Name', + 'legacy_code' => 'MSL Code', + 'msl_code' => 'Pcode', + 'speciality' => 'Speciality' + ]; +@endphp + + +
+ @include('layouts.shared/title-meta', ['title' => "History"]) + @include('layouts.shared/head-css', ["mode" => $mode ?? '', "demo" => $demo ?? '']) + + + +| Submission Date | + + @if($isMultiDoctorForm) + + @for($i = 1; $i <= 5; $i++) + @foreach($doctorFieldLabels as $code => $label) ++ {{ $label }} {{ $i }} + | + @endforeach + @endfor + + @else + + @foreach($questions as $code => $question) + @if($question->type == 'hidden') + @continue + @endif + + @if($question->type == 'multitextbox') + @foreach($question->options as $k => $v) ++ {{ is_object($v) ? ($v->display ?? $v->label ?? $k) : $v }} + ({{ $question->label }}) + | + @endforeach + @else +{{ $question->label }} | + @endif + @endforeach + + @endif + +Actions | +|||
|---|---|---|---|---|---|---|---|
| + {{ date("d M Y", strtotime($submission->updatedAt)) }} + | + + @if($isMultiDoctorForm) + + @php + $doctorData = []; + + foreach ($doctorFieldCodes as $code) { + $rawValue = $submission->formdata->{$code} ?? []; + + if (is_string($rawValue)) { + $values = explode(',', $rawValue); + } elseif (is_array($rawValue)) { + $values = $rawValue; + } elseif (is_object($rawValue)) { + $values = (array) $rawValue; + } else { + $values = []; + } + + $doctorData[$code] = array_map( + fn($value) => trim((string) $value), + array_values($values) + ); + } + @endphp + + @for($i = 0; $i < 5; $i++) + + @foreach($doctorFieldCodes as $code) + ++ {{ $doctorData[$code][$i] ?? '-' }} + | + + @endforeach + + @endfor + + @else + + @foreach(($userAttrs ?? []) as $attr) + @php + $uaUser = $submission->user_info ?? null; + $uaVal = '-'; + + if ($uaUser) { + if (isset($uaUser->{$attr}) && $uaUser->{$attr} !== '') { + $uaVal = $uaUser->{$attr}; + } elseif (isset($uaUser->{'attribute_'.$attr}) && $uaUser->{'attribute_'.$attr} !== '') { + $uaVal = $uaUser->{'attribute_'.$attr}; + } + } + @endphp + +{{ $uaVal }} | + @endforeach + + @foreach($questions as $code => $question) + + @if($question->type == 'hidden') + @continue + @endif + + @if($question->type == 'file') + ++ + Download + + | + + @elseif($question->type == 'radiometrix' && isset($submission->formdata->{$code}) && is_object($submission->formdata->{$code})) + ++ {{ collect((array)$submission->formdata->{$code})->map(function($val, $key) { + return "$key: $val"; + })->implode(', ') }} + | + + @elseif($question->type == 'multitextbox') + + @foreach($question->options as $k => $v) + @php + $optKey = is_object($v) ? ($v->value ?? $k) : $k; + $optVal = ''; + + if (isset($submission->formdata->{$optKey})) { + $raw = $submission->formdata->{$optKey}; + $optVal = is_array($raw) ? implode(', ', $raw) : (is_object($raw) ? json_encode($raw) : $raw); + } elseif (isset($submission->formdata->{$code}) && (is_object($submission->formdata->{$code}) || is_array($submission->formdata->{$code}))) { + $box = (array) $submission->formdata->{$code}; + + if (array_key_exists($optKey, $box)) { + $raw = $box[$optKey]; + $optVal = is_array($raw) ? implode(', ', $raw) : (is_object($raw) ? json_encode($raw) : $raw); + } + } + @endphp + +{{ $optVal }} | + @endforeach + + @else + ++ {{ isset($submission->formdata->{$code}) + ? (is_array($submission->formdata->{$code}) + ? implode(', ', $submission->formdata->{$code}) + : (is_object($submission->formdata->{$code}) + ? collect((array)$submission->formdata->{$code})->map(function($val, $key) { + return "$key: $val"; + })->implode(', ') + : $submission->formdata->{$code})) + : '' }} + | + + @endif + + @endforeach + + @endif + ++ @php + $isApproved = ($submission->workflow ?? '') == 'yes' + && ($submission->workflow_status ?? '') == 'approved'; + + $showFieldDelete = isset($form->allow_delete_by_user) + && $form->allow_delete_by_user == 'yes' + && !$isApproved; + @endphp + + + + @if($showFieldDelete || !empty($can_delete_submission)) + Delete + @endif + | +
+