Hi.Events icon indicating copy to clipboard operation
Hi.Events copied to clipboard

🌟Export all Answers from tickets

Open Sebastien88 opened this issue 9 months ago β€’ 8 comments

I was wondering if we can add a way to export all answers from questions asked to the attendee during checkout?

Sebastien88 avatar Mar 08 '25 02:03 Sebastien88

The answers should be included when you export the CSV on the Attendees admin page. Are you not seeing them?

daveearley avatar Mar 08 '25 12:03 daveearley

It kept giving me an error, but I will double check if the last commit fixes it. thanks

Sebastien88 avatar Mar 10 '25 05:03 Sebastien88

For me too, when try to export the answers, I get a 500 status error:

POST https://evento.potilivre.org/api/events/3/questions/answers/export
500

And when export from Attendees, I just have the default headers:

ID	First Name	Last Name	Email	Status	Is Checked In	Checked In At	Product ID	Product Name	Event ID	Public ID	Short ID	Created Date	Last Updated Date	Notes

Note: My questions are set to be required and I tested that users just complete the purchase when answers the questions.

Testing the postgres, the answers are storaged in SELECT * FROM question_answers;

docker compose logs all-in-one

all-in-one  | ::1 -  22/Mar/2025:14:21:21 +0000 "HEAD /index.php/events/3/questions/answers/export" 302
all-in-one  | 10.0.0.121 - - [22/Mar/2025:14:21:22 +0000] "HEAD /auth/login HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36"
all-in-one  | 10.0.0.121 - - [22/Mar/2025:14:24:24 +0000] "GET / HTTP/1.1" 200 1314 "-" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
all-in-one  | [2025-03-22 14:41:36] production.ERROR: SQLSTATE[22023]: Invalid parameter value: 7 ERROR:  invalid value for parameter "client_encoding": "utf8mb4" (Connection: mysql, SQL: insert into "job_batches" ("id", "name", "total_jobs", "pending_jobs", "failed_jobs", "failed_job_ids", "options", "created_at", "cancelled_at", "finished_at") values (9e7e5639-c8e6-4fc7-9543-3cb34cd5a549, Export Questions for Event #3, 0, 0, 0, [], YTowOnt9, 1742654496, ?, ?)) {"userId":1,"exception":"[object] (Illuminate\\Database\\QueryException(code: 22023): SQLSTATE[22023]: Invalid parameter value: 7 ERROR:  invalid value for parameter \"client_encoding\": \"utf8mb4\" (Connection: mysql, SQL: insert into \"job_batches\" (\"id\", \"name\", \"total_jobs\", \"pending_jobs\", \"failed_jobs\", \"failed_job_ids\", \"options\", \"created_at\", \"cancelled_at\", \"finished_at\") values (9e7e5639-c8e6-4fc7-9543-3cb34cd5a549, Export Questions for Event #3, 0, 0, 0, [], YTowOnt9, 1742654496, ?, ?)) at /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php:813)
all-in-one  | [stacktrace]
all-in-one  | #0 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(767): Illuminate\\Database\\Connection->runQueryCallback()
all-in-one  | #1 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(560): Illuminate\\Database\\Connection->run()
all-in-one  | #2 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(524): Illuminate\\Database\\Connection->statement()
all-in-one  | #3 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3509): Illuminate\\Database\\Connection->insert()
all-in-one  | #4 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/DatabaseBatchRepository.php(99): Illuminate\\Database\\Query\\Builder->insert()
all-in-one  | #5 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/PendingBatch.php(403): Illuminate\\Bus\\DatabaseBatchRepository->store()
all-in-one  | #6 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/PendingBatch.php(310): Illuminate\\Bus\\PendingBatch->store()
all-in-one  | #7 /app/backend/app/Services/Infrastructure/Jobs/JobPollingService.php(18): Illuminate\\Bus\\PendingBatch->dispatch()
all-in-one  | #8 /app/backend/app/Http/Actions/Questions/ExportQuestionAnswersAction.php(49): HiEvents\\Services\\Infrastructure\\Jobs\\JobPollingService->startJob()
all-in-one  | #9 /app/backend/app/Http/Actions/Questions/ExportQuestionAnswersAction.php(30): HiEvents\\Http\\Actions\\Questions\\ExportQuestionAnswersAction->startNewExportJob()
all-in-one  | #10 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): HiEvents\\Http\\Actions\\Questions\\ExportQuestionAnswersAction->__invoke()
all-in-one  | #11 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction()
all-in-one  | #12 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch()
all-in-one  | #13 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(206): Illuminate\\Routing\\Route->runController()
all-in-one  | #14 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
all-in-one  | #15 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
all-in-one  | #16 /app/backend/app/Http/Middleware/SetUserLocaleMiddleware.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #17 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\SetUserLocaleMiddleware->handle()
all-in-one  | #18 /app/backend/app/Http/Middleware/SetAccountContext.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #19 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\SetAccountContext->handle()
all-in-one  | #20 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #21 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
all-in-one  | #22 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #23 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(125): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequest()
all-in-one  | #24 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequestUsingNamedLimiter()
all-in-one  | #25 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
all-in-one  | #26 /app/backend/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(64): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #27 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Auth\\Middleware\\Authenticate->handle()
all-in-one  | #28 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #29 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then()
all-in-one  | #30 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack()
all-in-one  | #31 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute()
all-in-one  | #32 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute()
all-in-one  | #33 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
all-in-one  | #34 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
all-in-one  | #35 /app/backend/vendor/laravel/vapor-core/src/Http/Middleware/ServeStaticAssets.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #36 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Laravel\\Vapor\\Http\\Middleware\\ServeStaticAssets->handle()
all-in-one  | #37 /app/backend/app/Http/Middleware/VaporBinaryResponseMiddleware.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #38 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\VaporBinaryResponseMiddleware->handle()
all-in-one  | #39 /app/backend/app/Http/Middleware/HandleDeprecatedTimezones.php(25): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #40 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\HandleDeprecatedTimezones->handle()
all-in-one  | #41 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #42 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
all-in-one  | #43 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
all-in-one  | #44 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #45 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(50): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
all-in-one  | #46 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
all-in-one  | #47 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #48 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
all-in-one  | #49 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(110): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #50 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
all-in-one  | #51 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #52 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle()
all-in-one  | #53 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #54 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle()
all-in-one  | #55 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #56 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
all-in-one  | #57 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
all-in-one  | #58 /app/backend/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle()
all-in-one  | #59 {main}
all-in-one  | [previous exception] [object] (PDOException(code: 22023): SQLSTATE[22023]: Invalid parameter value: 7 ERROR:  invalid value for parameter \"client_encoding\": \"utf8mb4\" at /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php:87)
all-in-one  | [stacktrace]
all-in-one  | #0 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php(87): PDOStatement->execute()
all-in-one  | #1 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php(41): Illuminate\\Database\\Connectors\\PostgresConnector->configureEncoding()
all-in-one  | #2 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(185): Illuminate\\Database\\Connectors\\PostgresConnector->connect()
all-in-one  | #3 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->Illuminate\\Database\\Connectors\\{closure}()
all-in-one  | #4 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1219): call_user_func()
all-in-one  | #5 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(565): Illuminate\\Database\\Connection->getPdo()
all-in-one  | #6 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(800): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}()
all-in-one  | #7 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(767): Illuminate\\Database\\Connection->runQueryCallback()
all-in-one  | #8 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(560): Illuminate\\Database\\Connection->run()
all-in-one  | #9 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Connection.php(524): Illuminate\\Database\\Connection->statement()
all-in-one  | #10 /app/backend/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3509): Illuminate\\Database\\Connection->insert()
all-in-one  | #11 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/DatabaseBatchRepository.php(99): Illuminate\\Database\\Query\\Builder->insert()
all-in-one  | #12 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/PendingBatch.php(403): Illuminate\\Bus\\DatabaseBatchRepository->store()
all-in-one  | #13 /app/backend/vendor/laravel/framework/src/Illuminate/Bus/PendingBatch.php(310): Illuminate\\Bus\\PendingBatch->store()
all-in-one  | #14 /app/backend/app/Services/Infrastructure/Jobs/JobPollingService.php(18): Illuminate\\Bus\\PendingBatch->dispatch()
all-in-one  | #15 /app/backend/app/Http/Actions/Questions/ExportQuestionAnswersAction.php(49): HiEvents\\Services\\Infrastructure\\Jobs\\JobPollingService->startJob()
all-in-one  | #16 /app/backend/app/Http/Actions/Questions/ExportQuestionAnswersAction.php(30): HiEvents\\Http\\Actions\\Questions\\ExportQuestionAnswersAction->startNewExportJob()
all-in-one  | #17 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): HiEvents\\Http\\Actions\\Questions\\ExportQuestionAnswersAction->__invoke()
all-in-one  | #18 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction()
all-in-one  | #19 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch()
all-in-one  | #20 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Route.php(206): Illuminate\\Routing\\Route->runController()
all-in-one  | #21 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
all-in-one  | #22 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
all-in-one  | #23 /app/backend/app/Http/Middleware/SetUserLocaleMiddleware.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #24 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\SetUserLocaleMiddleware->handle()
all-in-one  | #25 /app/backend/app/Http/Middleware/SetAccountContext.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #26 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\SetAccountContext->handle()
all-in-one  | #27 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #28 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
all-in-one  | #29 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #30 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(125): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequest()
all-in-one  | #31 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequestUsingNamedLimiter()
all-in-one  | #32 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
all-in-one  | #33 /app/backend/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(64): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #34 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Auth\\Middleware\\Authenticate->handle()
all-in-one  | #35 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #36 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then()
all-in-one  | #37 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack()
all-in-one  | #38 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute()
all-in-one  | #39 /app/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute()
all-in-one  | #40 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
all-in-one  | #41 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
all-in-one  | #42 /app/backend/vendor/laravel/vapor-core/src/Http/Middleware/ServeStaticAssets.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #43 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Laravel\\Vapor\\Http\\Middleware\\ServeStaticAssets->handle()
all-in-one  | #44 /app/backend/app/Http/Middleware/VaporBinaryResponseMiddleware.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #45 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\VaporBinaryResponseMiddleware->handle()
all-in-one  | #46 /app/backend/app/Http/Middleware/HandleDeprecatedTimezones.php(25): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #47 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): HiEvents\\Http\\Middleware\\HandleDeprecatedTimezones->handle()
all-in-one  | #48 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #49 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
all-in-one  | #50 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
all-in-one  | #51 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #52 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(50): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
all-in-one  | #53 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
all-in-one  | #54 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #55 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
all-in-one  | #56 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(110): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #57 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
all-in-one  | #58 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #59 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle()
all-in-one  | #60 /app/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #61 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle()
all-in-one  | #62 /app/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
all-in-one  | #63 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
all-in-one  | #64 /app/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
all-in-one  | #65 /app/backend/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle()
all-in-one  | #66 {main}
all-in-one  | "} 
all-in-one  | 10.0.0.121 - - [22/Mar/2025:14:41:36 +0000] "POST /api/events/3/questions/answers/export HTTP/1.1" 500 44 "https://evento.potilivre.org/manage/event/3/questions" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0"
all-in-one  | 127.0.0.1 -  22/Mar/2025:14:41:36 +0000 "POST /index.php/events/3/questions/answers/export" 500

fguisso avatar Mar 22 '25 14:03 fguisso

Hi @fguisso,

The error indicates there is something wrong with you DB configuration. It says the connection is MySQL, but Hi.Events uses PostgreSQL. utf8mb4 is MySQL specific encoding.

Check your DB environment settings and make sure the DB_CONNECTION is set to pgsql

daveearley avatar Mar 23 '25 00:03 daveearley

@daveearley I'm following the docs and running the Docker Compose version. Everything is working, the postgres database is running and every other features are working. Like I said, when users finish a purchase, the data is stored in postgres, but just when export questions, it's not working.

If you want, I can provide more about my settings, but since I'm following the docs, there is no custom configs.

docker-compose.yml

DATABASE_URL=postgresql://postgres:<secret>@<db_name>:5432/hi-events

fguisso avatar Mar 25 '25 18:03 fguisso

hey @daveearley any thoughts about that?

While testing the answer export feature locally, I encountered multiple issues when using FILESYSTEM_PRIVATE_DISK=local. I asked ChatGPT for help to debug the flow. Here's a step-by-step breakdown of what we found and fixed β€” including the specific file paths that need attention.


🧩 Debugging Steps & Affected Files

  1. ❌ Missing DB_CONNECTION in Docker Compose
    File: docker/all-in-one/docker-compose.yml
    β†’ I added this line

    - DB_CONNECTION=pgsql
    
  2. ❌ Missing FILESYSTEM_PRIVATE_DISK in .env
    File: docker/all-in-one/.env
    β†’ I added in env, and in docker-compose:

    FILESYSTEM_PRIVATE_DISK=local
    
    - FILESYSTEM_PRIVATE_DISK=${FILESYSTEM_PRIVATE_DISK}
    
  3. ❌ Hardcoded 's3-private' disk in JobPollingService
    File: app/Services/Infrastructure/Jobs/JobPollingService.php
    β†’ Original line:

    private const STORAGE_DISK = 's3-private';
    

    β†’ I tried to replace it with:

    $this->disk = config('filesystems.private', env('FILESYSTEM_PRIVATE_DISK', 'local'));
    

    But this led to the next issue...

  4. πŸ’₯ Error when calling temporaryUrl() on a local disk
    File: Still in JobPollingService.php
    β†’ The method Storage::disk()->temporaryUrl() is used here:

    Storage::disk($this->disk)->temporaryUrl($filePath, now()->addMinutes(10))
    

    β†’ This caused the following runtime exception:

    RuntimeException: This driver does not support creating temporary URLs.
    

πŸ”Ž Root Cause

The export of answers relies on Storage::disk()->temporaryUrl(), which only works with drivers like s3. The local driver β€” commonly used in development β€” does not support this method.

In contrast, the attendee export feature works perfectly using Excel::download(...).


πŸ“ Working Example for Reference

File: app/Http/Actions/Attendees/ExportAttendeesAction.php
β†’ Uses:

return Excel::download(
    $this->export->withData($attendees, $questions),
    'attendees.xlsx'
);

This approach works with any storage configuration and avoids the need for signed URLs.


βœ… Suggested Fix

In JobPollingService.php, change the logic to:

if (method_exists(Storage::disk($this->disk), 'temporaryUrl')) {
    return Storage::disk($this->disk)->temporaryUrl($path, now()->addMinutes(10));
} else {
    return asset('storage/' . ltrim($path, '/')); // Or use Excel::download(...) directly
}

Alternatively, move the file export logic closer to the controller and use Excel::download() for local/dev environments.


πŸ§ͺ How to Reproduce

  1. Set FILESYSTEM_PRIVATE_DISK=local in your .env
  2. Start the project via Docker
  3. Go to an event’s admin questions page
  4. Try exporting answers
  5. Observe HTTP 500 + Laravel logs with temporaryUrl() error

βœ… Expected Behavior

Export should succeed and provide a file download regardless of disk driver, just like it already works for attendees.

fguisso avatar Apr 23 '25 13:04 fguisso

Quick Fix for my running event

I accessed the PostgreSQL database inside the Docker container and ran a custom SQL query that:

  • Joins question_answers, questions, and orders
  • Pivots the data so each question_id becomes a column
  • Outputs each buyer's email and their responses to those questions

βœ… The Query I Used

\COPY (
    SELECT 
        COALESCE(o.email, '[no email]') AS email,
        MAX(CASE WHEN qa.question_id = 2 THEN qa.answer::text END) AS question_2,
        MAX(CASE WHEN qa.question_id = 3 THEN qa.answer::text END) AS question_3,
        MAX(CASE WHEN qa.question_id = 4 THEN qa.answer::text END) AS question_4
    FROM question_answers qa
    JOIN questions q ON qa.question_id = q.id
    LEFT JOIN orders o ON qa.order_id = o.id
    WHERE qa.deleted_at IS NULL
    GROUP BY o.email
    ORDER BY o.email
) TO STDOUT WITH CSV HEADER;

🐳 How to Run This Inside Docker and Export to CSV

  1. Save the query to a file (e.g., export_answers.sql)
  2. Then run:
docker exec -i postgres psql -U postgres -d hi-events < export_answers.sql > answers.csv

This will generate a answers.csv file on your host machine with the data.

Alternatively, you can inline the query like this:

docker exec -i postgres psql -U postgres -d hi-events -c "<query>" > answers.csv

πŸ” For Others Wanting to Do the Same

If you're running Hi.Events locally and facing issues exporting answers through the UI:

  • You can inspect the database schema with \dt and \d <table> inside the psql console.
  • Identify the relationship between question_answers, orders, and questions.
  • Write a custom SQL query to pivot the answers based on question_id.
  • Use \COPY to export the result as CSV directly from PostgreSQL.

fguisso avatar Apr 23 '25 15:04 fguisso

Thanks for the details @fguisso. A fix for this will be released in the coming days.

daveearley avatar Apr 28 '25 04:04 daveearley