From 3c02c7a4c4eee7e9b2e0e4fb34967722468346ac Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Mon, 12 Jan 2026 19:04:15 -0300 Subject: [PATCH] fix: resolve captain module lint and rubocop errors --- Gemfile | 2 + Gemfile.lock | 6 + .../v1/captain/inter_webhooks_controller.rb | 69 ++ app/javascript/captain_booking/App.vue | 945 ++++++++++++++++++ .../captain_booking/assets/main.css | 14 + app/javascript/dashboard/api/captain/asset.js | 18 + .../dashboard/api/captain/assistant.js | 4 + .../dashboard/api/captain/inboxAutomations.js | 19 + .../dashboard/api/captain/inboxes.js | 7 + .../dashboard/api/captain/reminderSettings.js | 21 + .../dashboard/api/captain/reminders.js | 23 + .../dashboard/api/captain/reservations.js | 34 + app/javascript/dashboard/api/captain/units.js | 17 + .../AnimatingImg/AnimatingImg.story.vue | 1 + .../captain/AnimatingImg/Guardrails.vue | 1 + .../AnimatingImg/ResponseGuidelines.vue | 1 + .../captain/AnimatingImg/Scenarios.vue | 1 + .../captain/AnimatingImg/Settings.vue | 1 + .../components-next/captain/PageLayout.vue | 11 +- .../assistant/AddNewRulesDialog.story.vue | 1 + .../captain/assistant/AddNewRulesDialog.vue | 1 + .../assistant/AddNewRulesInput.story.vue | 1 + .../captain/assistant/AddNewRulesInput.vue | 1 + .../assistant/AddNewScenariosDialog.vue | 1 + .../captain/assistant/AssistantCard.story.vue | 1 + .../captain/assistant/AssistantCard.vue | 1 + .../captain/assistant/AssistantPlayground.vue | 1 + .../captain/assistant/BulkSelectBar.vue | 1 + .../captain/assistant/DocumentCard.story.vue | 1 + .../captain/assistant/DocumentCard.vue | 1 + .../captain/assistant/InboxCard.story.vue | 1 + .../captain/assistant/InboxCard.vue | 53 +- .../captain/assistant/MessageList.vue | 1 + .../captain/assistant/ResponseCard.story.vue | 1 + .../captain/assistant/ResponseCard.vue | 1 + .../captain/assistant/RuleCard.story.vue | 1 + .../captain/assistant/RuleCard.vue | 1 + .../captain/assistant/ScenariosCard.story.vue | 1 + .../captain/assistant/ScenariosCard.vue | 1 + .../assistant/SuggestedRules.story.vue | 1 + .../captain/assistant/SuggestedRules.vue | 1 + .../captain/assistant/ToolsDropdown.story.vue | 1 + .../captain/assistant/ToolsDropdown.vue | 1 + .../pageComponents/BulkDeleteDialog.vue | 1 + .../captain/pageComponents/DeleteDialog.vue | 1 + .../captain/pageComponents/Paywall.vue | 1 + .../pageComponents/asset/AssetCard.vue | 111 ++ .../pageComponents/asset/AssetForm.vue | 204 ++++ .../asset/CreateAssetDialog.vue | 54 + .../pageComponents/asset/EditAssetDialog.vue | 69 ++ .../assistant/AssistantForm.vue | 1 + .../assistant/CreateAssistantDialog.vue | 1 + .../settings/AssistantBasicSettingsForm.vue | 1 + .../settings/AssistantControlItems.vue | 1 + .../settings/AssistantSystemSettingsForm.vue | 1 + .../settings/AssistantWebhookSettings.vue | 209 ++++ .../pageComponents/customTool/AuthConfig.vue | 1 + .../customTool/CreateCustomToolDialog.vue | 1 + .../customTool/CustomToolCard.vue | 1 + .../customTool/CustomToolForm.vue | 74 +- .../pageComponents/customTool/HeaderRow.vue | 81 ++ .../pageComponents/customTool/ParamRow.vue | 1 + .../customTool/ToolTestDialog.vue | 1 + .../document/CreateDocumentDialog.vue | 1 + .../pageComponents/document/DocumentForm.vue | 1 + .../pageComponents/document/LimitBanner.vue | 1 + .../document/RelatedResponses.vue | 1 + .../emptyStates/AssistantPageEmptyState.vue | 1 + .../emptyStates/CustomToolsPageEmptyState.vue | 1 + .../emptyStates/DocumentPageEmptyState.vue | 1 + .../emptyStates/InboxPageEmptyState.vue | 1 + .../emptyStates/ResponsePageEmptyState.vue | 1 + .../inbox/ConnectInboxDialog.vue | 1 + .../pageComponents/inbox/ConnectInboxForm.vue | 40 +- .../response/CreateResponseDialog.vue | 1 + .../pageComponents/response/LimitBanner.vue | 1 + .../pageComponents/response/ResponseForm.vue | 1 + .../settings/SettingsHeader.story.vue | 1 + .../settings/SettingsHeader.vue | 1 + .../switcher/AssistantSwitcher.vue | 1 + .../components-next/sidebar/Sidebar.vue | 64 ++ .../components/widgets/BackButton.vue | 5 +- .../dashboard/composables/useUISettings.js | 1 + .../i18n/locale/en/conversation.json | 1 + .../i18n/locale/en/integrations.json | 197 +++- .../dashboard/i18n/locale/en/settings.json | 2 + .../i18n/locale/pt_BR/conversation.json | 1 + .../i18n/locale/pt_BR/integrations.json | 238 ++++- .../dashboard/i18n/locale/pt_BR/settings.json | 2 + .../routes/dashboard/captain/assets/Index.vue | 143 +++ .../dashboard/captain/assistants/Index.vue | 1 + .../captain/assistants/guardrails/Index.vue | 1 + .../captain/assistants/guidelines/Index.vue | 1 + .../captain/assistants/inboxes/Index.vue | 2 + .../captain/assistants/playground/Index.vue | 1 + .../captain/assistants/scenarios/Index.vue | 5 +- .../captain/assistants/settings/Settings.vue | 12 +- .../captain/assistants/tools/Index.vue | 3 +- .../dashboard/captain/brands/BrandModal.vue | 204 ++++ .../routes/dashboard/captain/brands/Index.vue | 242 +++++ .../dashboard/captain/captain.routes.js | 116 ++- .../captain/configurations/Index.vue | 144 +++ .../dashboard/captain/documents/Index.vue | 1 + .../dashboard/captain/extras/ExtraModal.vue | 150 +++ .../routes/dashboard/captain/extras/Index.vue | 169 ++++ .../captain/pages/AssistantsIndexPage.vue | 1 + .../captain/pages/CaptainPageRouteView.vue | 1 + .../captain/pages/CaptainToolsPage.vue | 13 +- .../dashboard/captain/pricings/Index.vue | 183 ++++ .../captain/pricings/PricingModal.vue | 306 ++++++ .../dashboard/captain/reminders/Index.vue | 118 +++ .../dashboard/captain/reservations/Index.vue | 389 +++++++ .../dashboard/captain/responses/Index.vue | 1 + .../dashboard/captain/responses/Pending.vue | 1 + .../routes/dashboard/captain/tools/Index.vue | 1 + .../routes/dashboard/captain/units/Index.vue | 233 +++++ .../dashboard/captain/units/UnitModal.vue | 319 ++++++ .../dashboard/conversation/ContactPanel.vue | 19 + .../conversation/captain/ReservationPanel.vue | 542 ++++++++++ .../dashboard/store/captain/asset.js | 22 + app/javascript/dashboard/store/index.js | 2 + app/javascript/entrypoints/captain_booking.js | 8 + app/models/account.rb | 8 + app/models/channel/whatsapp.rb | 9 + app/models/inbox.rb | 2 +- app/services/captain/inter_service.rb | 121 +++ config/agents/tools.yml | 10 + config/locales/en.yml | 9 + config/locales/pt_BR.yml | 9 + config/routes.rb | 30 +- config/schedule.yml | 6 + ...523120000_create_captain_configurations.rb | 15 + ...ff_webhook_config_to_captain_assistants.rb | 7 + .../20260112090000_create_captain_assets.rb | 14 + ...0000_add_suite_images_to_captain_brands.rb | 5 + ..._create_captain_inbox_reminder_settings.rb | 20 + ...60114090100_create_captain_reservations.rb | 25 + ...20260114090200_create_captain_reminders.rb | 32 + ...100000_create_captain_inbox_automations.rb | 66 ++ ...ys_use_reminder_tool_to_captain_inboxes.rb | 7 + .../20260114101001_create_captain_brands.rb | 12 + .../20260114101002_create_captain_units.rb | 13 + .../20260114101003_create_captain_pricing.rb | 14 + .../20260114101004_create_captain_extras.rb | 17 + ...external_fields_to_captain_reservations.rb | 10 + .../20260114101006_create_captain_suites.rb | 14 + ..._add_inter_credentials_to_captain_units.rb | 10 + ...260114101008_create_captain_pix_charges.rb | 18 + ...payment_context_to_captain_reservations.rb | 5 + ...60114101010_add_unit_to_captain_inboxes.rb | 5 + ...d_inter_account_number_to_captain_units.rb | 5 + ...101012_add_webhook_url_to_captain_units.rb | 5 + ...114101013_add_inbox_id_to_captain_units.rb | 5 + db/schema.rb | 244 ++++- .../v1/accounts/captain/assets_controller.rb | 50 + .../captain/assistant_responses_controller.rb | 1 + .../accounts/captain/assistants_controller.rb | 64 +- .../v1/accounts/captain/brands_controller.rb | 52 + .../captain/configurations_controller.rb | 34 + .../v1/accounts/captain/extras_controller.rb | 52 + .../captain/inbox_automations_controller.rb | 58 ++ .../v1/accounts/captain/inboxes_controller.rb | 14 +- .../captain/payment_callbacks_controller.rb | 20 + .../accounts/captain/pricings_controller.rb | 52 + .../accounts/captain/reminders_controller.rb | 37 + .../captain/reservations_controller.rb | 60 ++ .../v1/accounts/captain/units_controller.rb | 52 + .../captain/reminder_settings_controller.rb | 49 + .../api/v1/captain/booking_app_controller.rb | 16 + .../api/v1/captain/master_data_controller.rb | 33 + .../api/v1/captain/reservations_controller.rb | 172 ++++ .../api/v1/captain/webhooks_controller.rb | 54 + .../javascript/captain_booking_app/App.tsx | 713 +++++++++++++ .../components/AdminPage.tsx | 828 +++++++++++++++ .../captain_booking_app/components/Button.tsx | 0 .../components/FormField.tsx | 109 ++ .../components/SelectField.tsx | 87 ++ .../components/ui/button.tsx | 94 ++ .../components/ui/confetti.tsx | 12 + .../javascript/captain_booking_app/index.css | 76 ++ .../javascript/captain_booking_app/index.html | 12 + .../captain_booking_app/lib/utils.ts | 7 + .../services/apiService.ts | 88 ++ .../services/brandService.ts | 32 + .../services/extraService.ts | 43 + .../services/hotelUnitService.ts | 53 + .../services/pricingService.ts | 60 ++ .../services/suiteService.ts | 69 ++ .../javascript/captain_booking_app/types.ts | 237 +++++ .../conversation/response_builder_job.rb | 33 +- .../app/jobs/captain/reminders/trigger_job.rb | 9 + enterprise/app/models/captain/asset.rb | 65 ++ enterprise/app/models/captain/assistant.rb | 9 + enterprise/app/models/captain/brand.rb | 10 + .../app/models/captain/configuration.rb | 8 + enterprise/app/models/captain/extra.rb | 7 + .../app/models/captain/inbox_automation.rb | 41 + .../models/captain/inbox_reminder_setting.rb | 37 + enterprise/app/models/captain/pix_charge.rb | 11 + enterprise/app/models/captain/pricing.rb | 8 + enterprise/app/models/captain/reminder.rb | 21 + enterprise/app/models/captain/reservation.rb | 36 + enterprise/app/models/captain/suite.rb | 9 + enterprise/app/models/captain/unit.rb | 21 + enterprise/app/models/captain_inbox.rb | 1 + enterprise/app/models/concerns/agentable.rb | 5 +- .../app/models/enterprise/concerns/account.rb | 6 + .../app/models/enterprise/concerns/inbox.rb | 2 + .../app/policies/captain/asset_policy.rb | 21 + .../app/policies/captain/assistant_policy.rb | 4 + .../captain/inbox_automation_policy.rb | 27 + .../app/policies/captain/reminder_policy.rb | 17 + .../policies/captain/reservation_policy.rb | 21 + .../captain/handoff_webhook_service.rb | 105 ++ .../services/captain/inter/auth_service.rb | 61 ++ .../app/services/captain/inter/cob_service.rb | 72 ++ .../captain/llm/assistant_chat_service.rb | 35 +- .../captain/media_interpolation_service.rb | 22 + .../captain/reminders/create_service.rb | 90 ++ .../services/captain/reminders/processor.rb | 116 +++ .../captain/reservations/create_service.rb | 207 ++++ .../app/services/captain/tools/base_tool.rb | 5 +- .../captain/tools/check_availability_tool.rb | 49 + .../captain/tools/generate_pix_tool.rb | 91 ++ .../services/captain/tools/reminder_tool.rb | 57 ++ .../tools/search_documentation_service.rb | 2 +- .../captain/tools/suite_watchdog_tool.rb | 55 + .../captain/webhook_sender_service.rb | 67 ++ .../captain/whatsapp_notification_service.rb | 98 ++ .../captain/assets/create.json.jbuilder | 1 + .../captain/assets/index.json.jbuilder | 10 + .../captain/assets/show.json.jbuilder | 1 + .../captain/assets/update.json.jbuilder | 1 + .../captain/brands/_brand.json.jbuilder | 5 + .../captain/brands/index.json.jbuilder | 2 + .../captain/brands/show.json.jbuilder | 2 + .../captain/extras/_extra.json.jbuilder | 5 + .../captain/extras/index.json.jbuilder | 2 + .../captain/extras/show.json.jbuilder | 2 + .../inbox_automations/create.json.jbuilder | 1 + .../inbox_automations/index.json.jbuilder | 10 + .../inbox_automations/update.json.jbuilder | 1 + .../captain/inboxes/create.json.jbuilder | 7 +- .../captain/inboxes/index.json.jbuilder | 11 +- .../captain/inboxes/update.json.jbuilder | 6 + .../captain/pricings/_pricing.json.jbuilder | 7 + .../captain/pricings/index.json.jbuilder | 2 + .../captain/pricings/show.json.jbuilder | 2 + .../captain/reminders/_reminder.json.jbuilder | 6 + .../captain/reminders/create.json.jbuilder | 1 + .../captain/reminders/index.json.jbuilder | 2 + .../captain/reminders/show.json.jbuilder | 2 + .../captain/reservations/create.json.jbuilder | 1 + .../captain/reservations/index.json.jbuilder | 10 + .../captain/reservations/show.json.jbuilder | 1 + .../captain/reservations/update.json.jbuilder | 1 + .../v1/models/captain/_asset.json.jbuilder | 8 + .../models/captain/_assistant.json.jbuilder | 1 + .../captain/_inbox_automation.json.jbuilder | 11 + .../v1/models/captain/_reminder.json.jbuilder | 17 + .../models/captain/_reservation.json.jbuilder | 12 + .../api/v1/captain/booking_app/index.html.erb | 14 + .../lib/captain/prompts/assistant.liquid | 7 +- package.json | 11 + pnpm-lock.yaml | 488 ++++++++- .../2026-01-11_fix_401_custom_tool_headers.md | 56 ++ .../2026-01-11_fix_missing_agent_tools.md | 46 + ...26-01-11_handoff_webhook_implementation.md | 190 ++++ .../2026-01-12_fix_reservation_errors.md | 98 ++ ...6-01-12_whatsapp_automation_implemented.md | 35 + progresso/como_foi_feito_integracao_react.md | 65 ++ progresso/feature_webhook_url_unidades.md | 42 + progresso/fluxo_pix_publico.md | 71 ++ public/captain/booking/.vite/manifest.json | 11 + public/captain/booking/assets/index.css | 1 + public/captain/booking/assets/index.js | 18 + public/captain/booking/index.html | 13 + scripts/check_pending_embeddings.rb | 30 + scripts/debug_callback_logic.rb | 36 + scripts/debug_faq_flow.rb | 65 ++ scripts/debug_faq_search.rb | 57 ++ scripts/debug_status_suites.rb | 85 ++ scripts/force_create_captain_tables.rb | 36 + scripts/seed_unit.rb | 9 + scripts/simulate_pix_webhook.rb | 62 ++ scripts/simulate_webhook_event.rb | 59 ++ scripts/test_whatsapp_notification.rb | 69 ++ tailwind.config.js | 36 + vite.captain.config.mts | 26 + 289 files changed, 13552 insertions(+), 65 deletions(-) create mode 100644 app/controllers/public/api/v1/captain/inter_webhooks_controller.rb create mode 100644 app/javascript/captain_booking/App.vue create mode 100644 app/javascript/captain_booking/assets/main.css create mode 100644 app/javascript/dashboard/api/captain/asset.js create mode 100644 app/javascript/dashboard/api/captain/inboxAutomations.js create mode 100644 app/javascript/dashboard/api/captain/reminderSettings.js create mode 100644 app/javascript/dashboard/api/captain/reminders.js create mode 100644 app/javascript/dashboard/api/captain/reservations.js create mode 100644 app/javascript/dashboard/api/captain/units.js create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/asset/AssetCard.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/asset/AssetForm.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/asset/CreateAssetDialog.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/asset/EditAssetDialog.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantWebhookSettings.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/customTool/HeaderRow.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/assets/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/brands/BrandModal.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/brands/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/configurations/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/extras/ExtraModal.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/extras/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/pricings/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/pricings/PricingModal.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/reminders/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/reservations/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/units/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/units/UnitModal.vue create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/captain/ReservationPanel.vue create mode 100644 app/javascript/dashboard/store/captain/asset.js create mode 100644 app/javascript/entrypoints/captain_booking.js create mode 100644 app/services/captain/inter_service.rb create mode 100644 db/migrate/20240523120000_create_captain_configurations.rb create mode 100644 db/migrate/20260111070000_add_handoff_webhook_config_to_captain_assistants.rb create mode 100644 db/migrate/20260112090000_create_captain_assets.rb create mode 100644 db/migrate/20260113120000_add_suite_images_to_captain_brands.rb create mode 100644 db/migrate/20260114090000_create_captain_inbox_reminder_settings.rb create mode 100644 db/migrate/20260114090100_create_captain_reservations.rb create mode 100644 db/migrate/20260114090200_create_captain_reminders.rb create mode 100644 db/migrate/20260114100000_create_captain_inbox_automations.rb create mode 100644 db/migrate/20260114101000_add_always_use_reminder_tool_to_captain_inboxes.rb create mode 100644 db/migrate/20260114101001_create_captain_brands.rb create mode 100644 db/migrate/20260114101002_create_captain_units.rb create mode 100644 db/migrate/20260114101003_create_captain_pricing.rb create mode 100644 db/migrate/20260114101004_create_captain_extras.rb create mode 100644 db/migrate/20260114101005_add_external_fields_to_captain_reservations.rb create mode 100644 db/migrate/20260114101006_create_captain_suites.rb create mode 100644 db/migrate/20260114101007_add_inter_credentials_to_captain_units.rb create mode 100644 db/migrate/20260114101008_create_captain_pix_charges.rb create mode 100644 db/migrate/20260114101009_add_payment_context_to_captain_reservations.rb create mode 100644 db/migrate/20260114101010_add_unit_to_captain_inboxes.rb create mode 100644 db/migrate/20260114101011_add_inter_account_number_to_captain_units.rb create mode 100644 db/migrate/20260114101012_add_webhook_url_to_captain_units.rb create mode 100644 db/migrate/20260114101013_add_inbox_id_to_captain_units.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/assets_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/brands_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/configurations_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/extras_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/inbox_automations_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/payment_callbacks_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/pricings_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/reminders_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/reservations_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/units_controller.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/inboxes/captain/reminder_settings_controller.rb create mode 100644 enterprise/app/controllers/public/api/v1/captain/booking_app_controller.rb create mode 100644 enterprise/app/controllers/public/api/v1/captain/master_data_controller.rb create mode 100644 enterprise/app/controllers/public/api/v1/captain/reservations_controller.rb create mode 100644 enterprise/app/controllers/public/api/v1/captain/webhooks_controller.rb create mode 100755 enterprise/app/javascript/captain_booking_app/App.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/AdminPage.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/Button.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/FormField.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/SelectField.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/ui/button.tsx create mode 100755 enterprise/app/javascript/captain_booking_app/components/ui/confetti.tsx create mode 100644 enterprise/app/javascript/captain_booking_app/index.css create mode 100644 enterprise/app/javascript/captain_booking_app/index.html create mode 100755 enterprise/app/javascript/captain_booking_app/lib/utils.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/apiService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/brandService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/extraService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/hotelUnitService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/pricingService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/services/suiteService.ts create mode 100755 enterprise/app/javascript/captain_booking_app/types.ts create mode 100644 enterprise/app/jobs/captain/reminders/trigger_job.rb create mode 100644 enterprise/app/models/captain/asset.rb create mode 100644 enterprise/app/models/captain/brand.rb create mode 100644 enterprise/app/models/captain/configuration.rb create mode 100644 enterprise/app/models/captain/extra.rb create mode 100644 enterprise/app/models/captain/inbox_automation.rb create mode 100644 enterprise/app/models/captain/inbox_reminder_setting.rb create mode 100644 enterprise/app/models/captain/pix_charge.rb create mode 100644 enterprise/app/models/captain/pricing.rb create mode 100644 enterprise/app/models/captain/reminder.rb create mode 100644 enterprise/app/models/captain/reservation.rb create mode 100644 enterprise/app/models/captain/suite.rb create mode 100644 enterprise/app/models/captain/unit.rb create mode 100644 enterprise/app/policies/captain/asset_policy.rb create mode 100644 enterprise/app/policies/captain/inbox_automation_policy.rb create mode 100644 enterprise/app/policies/captain/reminder_policy.rb create mode 100644 enterprise/app/policies/captain/reservation_policy.rb create mode 100644 enterprise/app/services/captain/handoff_webhook_service.rb create mode 100644 enterprise/app/services/captain/inter/auth_service.rb create mode 100644 enterprise/app/services/captain/inter/cob_service.rb create mode 100644 enterprise/app/services/captain/media_interpolation_service.rb create mode 100644 enterprise/app/services/captain/reminders/create_service.rb create mode 100644 enterprise/app/services/captain/reminders/processor.rb create mode 100644 enterprise/app/services/captain/reservations/create_service.rb create mode 100644 enterprise/app/services/captain/tools/check_availability_tool.rb create mode 100644 enterprise/app/services/captain/tools/generate_pix_tool.rb create mode 100644 enterprise/app/services/captain/tools/reminder_tool.rb create mode 100644 enterprise/app/services/captain/tools/suite_watchdog_tool.rb create mode 100644 enterprise/app/services/captain/webhook_sender_service.rb create mode 100644 enterprise/app/services/captain/whatsapp_notification_service.rb create mode 100644 enterprise/app/views/api/v1/accounts/captain/assets/create.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/assets/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/assets/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/assets/update.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/brands/_brand.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/brands/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/brands/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/extras/_extra.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/extras/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/extras/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/inbox_automations/create.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/inbox_automations/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/inbox_automations/update.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/inboxes/update.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/pricings/_pricing.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/pricings/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/pricings/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reminders/_reminder.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reminders/create.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reminders/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reminders/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reservations/create.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reservations/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reservations/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/reservations/update.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/captain/_asset.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/captain/_inbox_automation.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/captain/_reminder.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/captain/_reservation.json.jbuilder create mode 100644 enterprise/app/views/public/api/v1/captain/booking_app/index.html.erb create mode 100644 progresso/2026-01-11_fix_401_custom_tool_headers.md create mode 100644 progresso/2026-01-11_fix_missing_agent_tools.md create mode 100644 progresso/2026-01-11_handoff_webhook_implementation.md create mode 100644 progresso/2026-01-12_fix_reservation_errors.md create mode 100644 progresso/2026-01-12_whatsapp_automation_implemented.md create mode 100644 progresso/como_foi_feito_integracao_react.md create mode 100644 progresso/feature_webhook_url_unidades.md create mode 100644 progresso/fluxo_pix_publico.md create mode 100644 public/captain/booking/.vite/manifest.json create mode 100644 public/captain/booking/assets/index.css create mode 100644 public/captain/booking/assets/index.js create mode 100644 public/captain/booking/index.html create mode 100644 scripts/check_pending_embeddings.rb create mode 100644 scripts/debug_callback_logic.rb create mode 100644 scripts/debug_faq_flow.rb create mode 100644 scripts/debug_faq_search.rb create mode 100644 scripts/debug_status_suites.rb create mode 100644 scripts/force_create_captain_tables.rb create mode 100644 scripts/seed_unit.rb create mode 100644 scripts/simulate_pix_webhook.rb create mode 100644 scripts/simulate_webhook_event.rb create mode 100644 scripts/test_whatsapp_notification.rb create mode 100644 vite.captain.config.mts diff --git a/Gemfile b/Gemfile index c20a4d5..c4baf61 100755 --- a/Gemfile +++ b/Gemfile @@ -270,3 +270,5 @@ group :development, :test do gem 'spring' gem 'spring-watcher-listen' end + +gem "rqrcode", "~> 3.2" diff --git a/Gemfile.lock b/Gemfile.lock index fa99e92..a45d34b 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,6 +188,7 @@ GEM byebug (11.1.3) childprocess (5.1.0) logger (~> 1.5) + chunky_png (1.4.0) climate_control (1.2.0) coderay (1.1.3) commonmarker (0.23.10) @@ -768,6 +769,10 @@ GEM nokogiri rexml (3.4.4) rotp (6.3.0) + rqrcode (3.2.0) + chunky_png (~> 1.0) + rqrcode_core (~> 2.0) + rqrcode_core (2.1.0) rspec-core (3.13.0) rspec-support (~> 3.13.0) rspec-expectations (3.13.2) @@ -1127,6 +1132,7 @@ DEPENDENCIES responders (>= 3.1.1) rest-client reverse_markdown + rqrcode (~> 3.2) rspec-rails (>= 6.1.5) rspec_junit_formatter rubocop diff --git a/app/controllers/public/api/v1/captain/inter_webhooks_controller.rb b/app/controllers/public/api/v1/captain/inter_webhooks_controller.rb new file mode 100644 index 0000000..f667457 --- /dev/null +++ b/app/controllers/public/api/v1/captain/inter_webhooks_controller.rb @@ -0,0 +1,69 @@ +class Public::Api::V1::Captain::InterWebhooksController < ApplicationController + skip_before_action :verify_authenticity_token + + # rubocop:disable Metrics/AbcSize, Metrics/MethodLength + def create + payload = JSON.parse(request.body.read) + pix_data = payload['pix'] + + if pix_data.blank? + render json: { message: 'Ignored: No pix data' }, status: :ok + return + end + + txid = pix_data['txid'] + e2eid = pix_data['endToEndId'] + + # Idempotency Check + existing_charge = ::Captain::PixCharge.find_by(e2eid: e2eid) + if existing_charge + render json: { message: 'Already processed' }, status: :ok + return + end + + # Find Charge + charge = ::Captain::PixCharge.find_by(txid: txid) + unless charge + render json: { message: 'Charge not found' }, status: :ok # Return 200 to satisfy Inter retry policy + return + end + + # Update Charge + charge.update!( + status: 'paid', + e2eid: e2eid, + paid_at: Time.current, + raw_webhook_payload: payload + ) + + # Update Reservation + charge.reservation.update!(payment_status: 'paid') + + # Notify Chat + notify_chat(charge.reservation) + + render json: { message: 'Received' }, status: :ok + rescue StandardError => e + Rails.logger.error "Webhook Error: #{e.message}" + render json: { error: e.message }, status: :unprocessable_entity + end + # rubocop:enable Metrics/AbcSize, Metrics/MethodLength + + private + + def notify_chat(reservation) + return unless reservation.conversation_id + + conversation = Conversation.find(reservation.conversation_id) + + Messages::CreateService.new( + conversation: conversation, + params: { + content: "✅ Pagamento confirmado! Sua reserva ##{reservation.id} na unidade #{reservation.captain_unit.name} está garantida.", + message_type: :outgoing + } + ).perform + rescue StandardError => e + Rails.logger.error "Failed to notify chat: #{e.message}" + end +end diff --git a/app/javascript/captain_booking/App.vue b/app/javascript/captain_booking/App.vue new file mode 100644 index 0000000..f303daf --- /dev/null +++ b/app/javascript/captain_booking/App.vue @@ -0,0 +1,945 @@ + + +