QuoteController :: generateQuotePdf
Request
GET Parameters
No GET parameters
POST Parameters
No POST parameters
Uploaded Files
No files were uploaded
Request Attributes
Key | Value |
---|---|
_controller | "App\Controller\Quote\QuoteController::generateQuotePdf" |
_firewall_context | "security.firewall.map.context.api" |
_links | Fig\Link\GenericLinkProvider {#3783 -links: [ "0000000055f4ac2c0000000033fa16c9" => Fig\Link\Link {#3784 -href: "https://dev.app.pol-crm.com/api/docs.jsonld" -rel: [ "http://www.w3.org/ns/hydra/core#apiDocumentation" => true ] -attributes: [] } ] } |
_route | "quote_generate_pdf" |
_route_params | [ "id" => "quote_188395" ] |
_stopwatch_token | "51166e" |
id | "quote_188395" |
Request Headers
Header | Value |
---|---|
accept | "application/ld+json" |
accept-encoding | "gzip, deflate, br, zstd" |
accept-language | "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7" |
connection | "close" |
content-length | "108" |
content-type | "application/json" |
host | "dev.app.pol-crm.com" |
origin | "https://dev.pol-crm.com" |
priority | "u=1, i" |
referer | "https://dev.pol-crm.com/" |
sec-ch-ua | ""Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"" |
sec-ch-ua-mobile | "?0" |
sec-ch-ua-platform | ""Windows"" |
sec-fetch-dest | "empty" |
sec-fetch-mode | "cors" |
sec-fetch-site | "same-site" |
user-agent | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" |
x-accel-internal | "/internal-nginx-static-location" |
x-php-ob-level | "1" |
x-pol-auth | "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NjA5MTI0NDEsImV4cCI6MTc2MDkxNjA0MSwicm9sZXMiOlsiUk9MRV9VU0VSIiwiUk9MRV9TVVBFUkFETUlOIiwiUk9MRV9BRE1JTiIsIlJPTEVfTU9EVUxFX1BST0RVQ1QiLCJST0xFX01PRFVMRV9QUk9EVUNUX0NVU1RPTUlaRSIsIlJPTEVfTU9EVUxFX1FVT1RFX0xJTkUiLCJQUk9TUEVDVF9TSE9XIiwiUFJPU1BFQ1RfQ1VEIiwiQ09OVEFDVF9DVUQiLCJDT05UQUNUX1NIT1ciLCJUQVNLX1NIT1ciLCJUQVNLX0NVRCIsIlFVT1RFX1NIT1ciLCJRVU9URV9DVUQiLCJRVU9URV9SRUdFTkVSQVRFX1BSSUNFUyJdLCJsb2dpbiI6ImRlbW95YW5pZ2F2IiwidXNlcl9pZCI6InVzZXJfMTAxMSIsInVzZXJfZXh0ZXJuYWxfaWQiOiIxMDExIiwiZW1haWwiOiJnLXNhdXRyb25Ac2ZpLmZyIiwiY3VzdG9tZXJfaWQiOiJjdXN0b21lcl8xMjEiLCJjdXN0b21lcl9uYW1lIjoiWUFOSUdBViIsImN1c3RvbWVyX2V4dGVybmFsX2lkIjoiMTIxIiwiY3VzdG9tZXJfbWFpbGluZ19pZCI6IjE0NyIsImZpcnN0bmFtZSI6Ikd1aWxsYXVtZSIsImxhc3RuYW1lIjoiU0FVVFJPTiIsImxpdmVvTG9naW4iOm51bGwsImxpdmVvUGFzc3dvcmQiOm51bGwsImhhc0ludHJhbmV0IjpmYWxzZSwibGFuZ3VhZ2UiOiJGUiIsInNlY3Rpb25zX2xlYWRlZCI6W10sInNlY3Rpb25zX21lbWJlcnMiOlsidXNlcl8xMDExIl0sImlzX3NlY3Rpb25zX2FjdGl2YXRlZCI6ZmFsc2UsInJlZnJlc2hfdG9rZW4iOiIifQ.smruhTDO6MF4efpXGiPp4DyZoLSpsUh3ykwBDmscLGtkvlySQlnSFvS1bxozG8T5Y0oGdkijvDiliogWK_zhqLF6FXho-oEscgCbKhvTjdosGLc4QHX0QAtM1LeVpT3BGVz9isHY1J7X0RDnoWA2GdCwCZ-ELXlS7fP08w_Mc5j8GqGhN5XwD70MLfR5ltD75o5BEhCWKMsWsatkGs3bbd7AfjhqoSz7qexpiHj1BRszq-H5QekWiJWgwOLDUJc85rZYaNVbYu75qseEbKfW-kWAxOZhAZCmVfFDQ-qBxSJ1i7KwVasIGTJDTnJn7l8fDqFWF0jGtC4LJzQEOZDjoOrQVaP2szLusNdOeKICnE3GOpY7E2sHIJpbTf8KlRUSm0uKc4t4hgoSRxnCdQGLx4hcTGSGHyITgso7tVs6068piCfp8JttEo5SoXERPiVNl2oeKa7VQAgtUWMzPI-SYX6QfGCjnrYE3JcTufx8xFtvlS4pmeIaLNJs7Y8l21f-A8MB7y-3zOAzriYExuKUOtT9oZ0GRtCWG5oTUyQ2LI4IjzaqBW_ikRfcccdSOZqZxV_FVw1fO9vPg9Lgi9XKAfKtjCLtI9nMboiZsSk9mx5_CAREqtb476hnnUVOfvHCBazVRQo-FWsSSWNLCIe8MtR9pUny0D8hn5qCQ712Axk" |
x-real-ip | "176.174.157.21" |
x-transaction-id | "front:rcmv3izsqym" |
Request Content
Pretty
{ "templateId": "f47ef469dac34bc29180feb40a25724c", "showPrices": false, "customerId": "customer_121", "mode": null }
Raw
{"templateId":"f47ef469dac34bc29180feb40a25724c","showPrices":false,"customerId":"customer_121","mode":null}
Response
Response Headers
Header | Value |
---|---|
access-control-allow-origin | "https://dev.pol-crm.com" |
access-control-expose-headers | "x-debug-token, sentry-trace, baggage, retry-after" |
cache-control | "private, must-revalidate" |
content-type | "application/ld+json" |
date | "Sun, 19 Oct 2025 22:25:47 GMT" |
expires | -1 |
link | "<https://dev.app.pol-crm.com/api/docs.jsonld>; rel="http://www.w3.org/ns/hydra/core#apiDocumentation"" |
pragma | "no-cache" |
vary | "Accept" |
x-debug-token | "330b2c" |
x-debug-token-link | "https://dev.app.pol-crm.com/_profiler/805691" |
x-previous-debug-token | "805691" |
x-robots-tag | "noindex" |
Cookies
Request Cookies
No request cookies
Response Cookies
No response cookies
Session
Session Metadata
No session metadata
Session Attributes
No session attributes
Flashes
Flashes
No flash messages were created.
Server Parameters
Server Parameters
Defined in .env
Key | Value |
---|---|
API_BUSINESS_HOST | "http://dev.pol-api-business.pol-crm.com" |
API_CRM_HOST | "http://dev.pol-api-crm.pol-crm.com" |
API_GED_HOST | "http://dev.pol-api-ged.pol-crm.com" |
API_LIVEO | "https://webservice.centrex.liveo.fr/ws/" |
API_MIDDLEWARE_HOST | "https://pol-middleware" |
API_NOTIFY_HOST | "http://dev.pol-api-notify.pol-crm.com" |
API_PARAM_HOST | "http://dev.pol-api-param.pol-crm.com" |
API_POL_MAILING | "http://mailing.sfi.fr/webservices" |
API_POL_MAILING_V2 | "https://dev.mailing.pol-crm.com/webservices" |
API_SEARCH_HOST | "http://dev.pol-api-search.pol-crm.com" |
API_SERVICE_PLENETUDE_HOST | "http://dev.plenetude.pol-crm.com" |
API_USER_HOST | "http://dev.pol-api-user.pol-crm.com" |
APP_ENV | "dev" |
APP_SECRET | "61ff627c8e96e9ac55fc1926e4878f2e" |
BDD_API_BUSINESS | "dev_pol_core" |
BDD_API_CRM | "dev_pol_core" |
BDD_API_GED | "dev_pol_core" |
BDD_API_NOTIFY | "dev_pol_core" |
BDD_API_PARAM | "dev_pol_core" |
BDD_API_SEARCH | "dev_pol_core" |
BDD_API_USER | "dev_pol_core" |
BDD_MIDDLEWARE | "dev_pol_core" |
BDD_SERVICE_PLENETUDE | "dev_pol_core" |
BEGIN_DATE | "2024-01-01" |
CORS_ALLOW_ORIGIN | "^https?://pol-(crm|prospect).localhost(:[0-9]+)?$" |
DATABASE_URL | "mysql://dev_pol_core:VTgooWkhcjebxLPy8E2ycoTjytrULgNQ@127.0.0.1:3306/dev_pol_core" |
END_DATE | "2025-01-31" |
FRONT_URL | "https://pol-crm.localhost" |
FTP_INTRANET_SFI_HOST | "preprod.intranet.sfimultimedia.com" |
FTP_INTRANET_SFI_PASSWORD | "iAw453e?iAw453e?" |
FTP_INTRANET_SFI_USER | "intranetpreprod" |
GED_ABSOLUTE_DIRECTORY_PATH | "/var/www/pol-api-ged/application/data/ged" |
GEONAME_API_TOKEN | "ceciestuntestpourSfi/0000" |
IMPORT_ONDUPACK_PATH_FILE | "/httpdocs/app-pol-crm/dev/current/application/data/import_ondupack" |
INSEE_API_SIRENE_KEY | "09afd2bf-050b-465e-afd2-bf050b865e20" |
IS_MAINTENANCE | "false" |
JWT_PASSPHRASE | "7de1072d7a8fcab69679c1892deb39a7" |
JWT_PUBLIC_KEY | "%kernel.project_dir%/config/jwt/public.pem" |
JWT_SECRET_KEY | "%kernel.project_dir%/config/jwt/private.pem" |
JWT_WHITELIST_PATH | "%kernel.project_dir%/var/tokens" |
MAILER_URL | "smtp://127.0.0.1:1025" |
MAILING_ENV_USER | "depot_mailing_dev-xv42" |
MESSENGER_TRANSPORT_DSN_MIDDLEWARE | "amqp://sfiweb:sfiwweb0000@127.0.0.1:5672/%2f/dev_middleware_messages" |
MESSENGER_TRANSPORT_DSN_NOTIFY | "amqp://sfiweb:sfiwweb0000@127.0.0.1:5672/%2f/dev_notify_messages" |
MESSENGER_TRANSPORT_DSN_SEARCH | "amqp://sfiweb:sfiwweb0000@127.0.0.1:5672/%2f/dev_messages" |
MICROSOFT_GRAPH_API_CLIENT_ID | "3b7f02c4-aa14-4e54-a2b9-2ee1d5d17f8a" |
MICROSOFT_GRAPH_API_CLIENT_SECRET | "FID8Q~zfFRP~Gw-85LpaCj0VqrrRr__HMGpI-drP" |
MICROSOFT_GRAPH_API_NOTIFICATION_URL | "https://dev.app.pol-crm.com/api/microsoft-graph/outlook-subscription-configuration" |
MICROSOFT_GRAPH_API_REDIRECT_URI | "https://dev.pol-crm.com/microsoft-graph" |
MICROSOFT_GRAPH_API_SUBSCRIPTION_EXPIRED_AT | "+2 days" |
MICROSOFT_GRAPH_API_TOKEN_LIFETIME | "+2 days" |
MODULE_MICROSOFT_GRAPH_SECRET | "jqsFP7MjEx1FBe1138D3" |
MONOLOG_APPLICATION_ENVIRONMENT | "dev" |
MONOLOG_APPLICATION_NAME | "pol-middleware" |
MONOLOG_SUBJECT | "[DEV][%level_name%] POL-MIDDLEWARE - %message%" |
MONOLOG_TO_EMAIL | "polv3.log@sfi.fr" |
MYSQL_DATABASE | "dev_pol_core" |
MYSQL_HOST | "127.0.0.1" |
MYSQL_PASSWORD | "VTgooWkhcjebxLPy8E2ycoTjytrULgNQ" |
MYSQL_PORT | "3306" |
MYSQL_USER | "dev_pol_core" |
PREFIX_CUSTOMER_NAME_MAILING | "[DEV]" |
REDIS_ENABLE_V4 | "true" |
REDIS_PREFIX | "dev" |
REDIS_URL | "redis://127.0.0.1:6379" |
SECURITY_ENABLE_TOKEN_WHITELIST | "0" |
SENTRY_DSN | "https://99729cc06c8241e3b07e3f6ae9b6feec@sentry.sfimultimedia.com/9" |
SENTRY_ENVIRONMENT | "dev" |
SENTRY_PERFORMANCE_SAMPLE_RATE | "1.0" |
SFI_MAILING_URL | "https://mailing.sfi.fr/webservices/recupererContactPol.php" |
SFI_SSO_FORCE_CREDENTIALS | "87;707" |
SFI_SSO_MAILING_HOST | "https://mailing.sfi.fr/webservices/sso.php" |
SYSTEMUSER_0662705af65c48908b017d8fb0724bac_PASSWORD | "7G4k4WhQZDkkB5IGLRPcdfik5s58gf58f2g5s6W6T6BXfbYj2H_customer_newco" |
SYSTEMUSER_0662705af65c48908b017d8fb0724bac_USERNAME | "system_0662705af65c48908b017d8fb0724bac" |
SYSTEMUSER_customer_124_PASSWORD | "A6uraa5HQ87hY*unfx3$mr158!d7i*TX_customer_124" |
SYSTEMUSER_customer_124_USERNAME | "system_customer_124" |
SYSTEMUSER_customer_65_PASSWORD | "uBRJV4pUKP1wRk4iULwMnty93MPr4qr3Sod8jFlfJwZdURZB_customer_65" |
SYSTEMUSER_customer_65_USERNAME | "system_customer_65" |
SYSTEMUSER_customer_66_PASSWORD | "7G4k4WhQZDkkB5IGLRPcdfik3tOZfL4PVfs6W6T6BXfbYj2H_customer_66" |
SYSTEMUSER_customer_66_USERNAME | "system_customer_66" |
SYSTEMUSER_customer_98_PASSWORD | "wWZJwEgYjqLdPx77B1o9GR7r6r4Fvug82fmALJLvQCBjWD4G_customer_98" |
SYSTEMUSER_customer_98_USERNAME | "system_customer_98" |
SYSTEMUSER_e8919dbc01f34f79ab22b9c434f114eb_PASSWORD | "TPB5ccJCl4ZL5jurkpedelfwdEiYRt4g30xYM82" |
SYSTEMUSER_e8919dbc01f34f79ab22b9c434f114eb_USERNAME | "system_e8919dbc01f34f79ab22b9c434f114eb" |
Defined as regular env variables
Key | Value |
---|---|
APP_DEBUG | "1" |
CONTENT_LENGTH | "108" |
CONTENT_TYPE | "application/json" |
CONTEXT_DOCUMENT_ROOT | "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/current/application/public" |
CONTEXT_PREFIX | "" |
DOCUMENT_ROOT | "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/current/application/public" |
FCGI_ROLE | "RESPONDER" |
GATEWAY_INTERFACE | "CGI/1.1" |
HOME | "/var/www/vhosts/app.pol-crm.com" |
HTTPS | "on" |
HTTP_ACCEPT | "application/ld+json" |
HTTP_ACCEPT_ENCODING | "gzip, deflate, br, zstd" |
HTTP_ACCEPT_LANGUAGE | "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7" |
HTTP_CONNECTION | "close" |
HTTP_HOST | "dev.app.pol-crm.com" |
HTTP_ORIGIN | "https://dev.pol-crm.com" |
HTTP_PRIORITY | "u=1, i" |
HTTP_REFERER | "https://dev.pol-crm.com/" |
HTTP_SEC_CH_UA | ""Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"" |
HTTP_SEC_CH_UA_MOBILE | "?0" |
HTTP_SEC_CH_UA_PLATFORM | ""Windows"" |
HTTP_SEC_FETCH_DEST | "empty" |
HTTP_SEC_FETCH_MODE | "cors" |
HTTP_SEC_FETCH_SITE | "same-site" |
HTTP_USER_AGENT | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" |
HTTP_X_ACCEL_INTERNAL | "/internal-nginx-static-location" |
HTTP_X_POL_AUTH | "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NjA5MTI0NDEsImV4cCI6MTc2MDkxNjA0MSwicm9sZXMiOlsiUk9MRV9VU0VSIiwiUk9MRV9TVVBFUkFETUlOIiwiUk9MRV9BRE1JTiIsIlJPTEVfTU9EVUxFX1BST0RVQ1QiLCJST0xFX01PRFVMRV9QUk9EVUNUX0NVU1RPTUlaRSIsIlJPTEVfTU9EVUxFX1FVT1RFX0xJTkUiLCJQUk9TUEVDVF9TSE9XIiwiUFJPU1BFQ1RfQ1VEIiwiQ09OVEFDVF9DVUQiLCJDT05UQUNUX1NIT1ciLCJUQVNLX1NIT1ciLCJUQVNLX0NVRCIsIlFVT1RFX1NIT1ciLCJRVU9URV9DVUQiLCJRVU9URV9SRUdFTkVSQVRFX1BSSUNFUyJdLCJsb2dpbiI6ImRlbW95YW5pZ2F2IiwidXNlcl9pZCI6InVzZXJfMTAxMSIsInVzZXJfZXh0ZXJuYWxfaWQiOiIxMDExIiwiZW1haWwiOiJnLXNhdXRyb25Ac2ZpLmZyIiwiY3VzdG9tZXJfaWQiOiJjdXN0b21lcl8xMjEiLCJjdXN0b21lcl9uYW1lIjoiWUFOSUdBViIsImN1c3RvbWVyX2V4dGVybmFsX2lkIjoiMTIxIiwiY3VzdG9tZXJfbWFpbGluZ19pZCI6IjE0NyIsImZpcnN0bmFtZSI6Ikd1aWxsYXVtZSIsImxhc3RuYW1lIjoiU0FVVFJPTiIsImxpdmVvTG9naW4iOm51bGwsImxpdmVvUGFzc3dvcmQiOm51bGwsImhhc0ludHJhbmV0IjpmYWxzZSwibGFuZ3VhZ2UiOiJGUiIsInNlY3Rpb25zX2xlYWRlZCI6W10sInNlY3Rpb25zX21lbWJlcnMiOlsidXNlcl8xMDExIl0sImlzX3NlY3Rpb25zX2FjdGl2YXRlZCI6ZmFsc2UsInJlZnJlc2hfdG9rZW4iOiIifQ.smruhTDO6MF4efpXGiPp4DyZoLSpsUh3ykwBDmscLGtkvlySQlnSFvS1bxozG8T5Y0oGdkijvDiliogWK_zhqLF6FXho-oEscgCbKhvTjdosGLc4QHX0QAtM1LeVpT3BGVz9isHY1J7X0RDnoWA2GdCwCZ-ELXlS7fP08w_Mc5j8GqGhN5XwD70MLfR5ltD75o5BEhCWKMsWsatkGs3bbd7AfjhqoSz7qexpiHj1BRszq-H5QekWiJWgwOLDUJc85rZYaNVbYu75qseEbKfW-kWAxOZhAZCmVfFDQ-qBxSJ1i7KwVasIGTJDTnJn7l8fDqFWF0jGtC4LJzQEOZDjoOrQVaP2szLusNdOeKICnE3GOpY7E2sHIJpbTf8KlRUSm0uKc4t4hgoSRxnCdQGLx4hcTGSGHyITgso7tVs6068piCfp8JttEo5SoXERPiVNl2oeKa7VQAgtUWMzPI-SYX6QfGCjnrYE3JcTufx8xFtvlS4pmeIaLNJs7Y8l21f-A8MB7y-3zOAzriYExuKUOtT9oZ0GRtCWG5oTUyQ2LI4IjzaqBW_ikRfcccdSOZqZxV_FVw1fO9vPg9Lgi9XKAfKtjCLtI9nMboiZsSk9mx5_CAREqtb476hnnUVOfvHCBazVRQo-FWsSSWNLCIe8MtR9pUny0D8hn5qCQ712Axk" |
HTTP_X_REAL_IP | "176.174.157.21" |
HTTP_X_TRANSACTION_ID | "front:rcmv3izsqym" |
PASSENGER_COMPILE_NATIVE_SUPPORT_BINARY | "0" |
PASSENGER_DOWNLOAD_NATIVE_SUPPORT_BINARY | "0" |
PATH | "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" |
PHP_SELF | "/index.php" |
QUERY_STRING | "" |
REDIRECT_HTTPS | "on" |
REDIRECT_PASSENGER_COMPILE_NATIVE_SUPPORT_BINARY | "0" |
REDIRECT_PASSENGER_DOWNLOAD_NATIVE_SUPPORT_BINARY | "0" |
REDIRECT_SSL_TLS_SNI | "dev.app.pol-crm.com" |
REDIRECT_STATUS | "200" |
REDIRECT_URL | "/api/quote/quote_188395/generatepdf" |
REMOTE_ADDR | "176.174.157.21" |
REMOTE_PORT | "43676" |
REQUEST_METHOD | "POST" |
REQUEST_SCHEME | "https" |
REQUEST_TIME | 1760912746 |
REQUEST_TIME_FLOAT | 1760912746.1213 |
REQUEST_URI | "/api/quote/quote_188395/generatepdf" |
SCRIPT_FILENAME | "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/current/application/public/index.php" |
SCRIPT_NAME | "/index.php" |
SERVER_ADDR | "185.18.171.8" |
SERVER_ADMIN | "[no address given]" |
SERVER_NAME | "dev.app.pol-crm.com" |
SERVER_PORT | "443" |
SERVER_PROTOCOL | "HTTP/1.0" |
SERVER_SIGNATURE | "<address>Apache Server at dev.app.pol-crm.com Port 443</address>\n" |
SERVER_SOFTWARE | "Apache" |
SSL_TLS_SNI | "dev.app.pol-crm.com" |
SYMFONY_DOTENV_VARS | "APP_ENV,APP_SECRET,BDD_API_BUSINESS,BDD_API_CRM,BDD_API_GED,BDD_API_NOTIFY,BDD_API_PARAM,BDD_API_SEARCH,BDD_API_USER,BDD_MIDDLEWARE,BDD_SERVICE_PLENETUDE,MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DATABASE,DATABASE_URL,MAILER_URL,CORS_ALLOW_ORIGIN,JWT_SECRET_KEY,JWT_PUBLIC_KEY,JWT_PASSPHRASE,JWT_WHITELIST_PATH,MONOLOG_SUBJECT,MONOLOG_TO_EMAIL,MONOLOG_APPLICATION_NAME,MONOLOG_APPLICATION_ENVIRONMENT,MESSENGER_TRANSPORT_DSN_SEARCH,MESSENGER_TRANSPORT_DSN_NOTIFY,MESSENGER_TRANSPORT_DSN_MIDDLEWARE,SENTRY_DSN,SENTRY_ENVIRONMENT,SENTRY_PERFORMANCE_SAMPLE_RATE,IS_MAINTENANCE,SECURITY_ENABLE_TOKEN_WHITELIST,REDIS_ENABLE_V4,REDIS_URL,API_BUSINESS_HOST,API_CRM_HOST,API_GED_HOST,API_NOTIFY_HOST,API_PARAM_HOST,API_SEARCH_HOST,API_USER_HOST,API_MIDDLEWARE_HOST,API_SERVICE_PLENETUDE_HOST,API_POL_MAILING,API_POL_MAILING_V2,API_LIVEO,MAILING_ENV_USER,FTP_INTRANET_SFI_HOST,FTP_INTRANET_SFI_USER,FTP_INTRANET_SFI_PASSWORD,SFI_SSO_FORCE_CREDENTIALS,MICROSOFT_GRAPH_API_REDIRECT_URI,MICROSOFT_GRAPH_API_CLIENT_ID,MICROSOFT_GRAPH_API_NOTIFICATION_URL,MICROSOFT_GRAPH_API_CLIENT_SECRET,MICROSOFT_GRAPH_API_SUBSCRIPTION_EXPIRED_AT,MODULE_MICROSOFT_GRAPH_SECRET,INSEE_API_SIRENE_KEY,GEONAME_API_TOKEN,GED_ABSOLUTE_DIRECTORY_PATH,IMPORT_ONDUPACK_PATH_FILE,FRONT_URL,REDIS_PREFIX,SFI_SSO_MAILING_HOST,SFI_MAILING_URL,PREFIX_CUSTOMER_NAME_MAILING,MICROSOFT_GRAPH_API_TOKEN_LIFETIME,SYSTEMUSER_e8919dbc01f34f79ab22b9c434f114eb_USERNAME,SYSTEMUSER_e8919dbc01f34f79ab22b9c434f114eb_PASSWORD,SYSTEMUSER_customer_65_USERNAME,SYSTEMUSER_customer_65_PASSWORD,SYSTEMUSER_customer_66_USERNAME,SYSTEMUSER_customer_66_PASSWORD,SYSTEMUSER_customer_124_USERNAME,SYSTEMUSER_customer_124_PASSWORD,SYSTEMUSER_0662705af65c48908b017d8fb0724bac_USERNAME,SYSTEMUSER_0662705af65c48908b017d8fb0724bac_PASSWORD,SYSTEMUSER_customer_98_USERNAME,SYSTEMUSER_customer_98_PASSWORD,BEGIN_DATE,END_DATE" |
USER | "app-pol-crm" |
proxy-nokeepalive | "1" |
Sub Requests 1
ErrorController (token = 805691)
Key | Value |
---|---|
_controller | "error_controller" |
_links | Fig\Link\GenericLinkProvider {#4110 -links: [ "0000000055f4ad070000000033fa16c9" => Fig\Link\Link {#4067 -href: "https://dev.app.pol-crm.com/api/docs.jsonld" -rel: [ "http://www.w3.org/ns/hydra/core#apiDocumentation" => true ] -attributes: [] } ] } |
_stopwatch_token | "f746c6" |
exception | Twig\Error\SyntaxError {#4420 -lineno: 133 -name: "quote_pdf (string template 1ba51d88cc7b7b4c077dceaafdbd99029f38167d77930ef9228cb7697e5426a6)" -rawMessage: "Unknown "list" filter. Did you mean "last"?" -sourcePath: "" -sourceCode: """ <!doctype html>\n <html lang="fr">\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1">\n <title>Devis – YANIGAV – {{ quote.name|default('Enfonce-pieux HYDROCHOC HPG 790') }}</title>\n <style>\n :root { --primary:#0f172a; --muted:#475569; --border:#e2e8f0; --bg:#f8fafc; }\n html, body { margin:0; padding:0; background:var(--bg); color:#0b1220; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji"; }\n .page { max-width:900px; margin:2rem auto; background:#fff; border:1px solid var(--border); border-radius:12px; overflow:hidden; box-shadow:0 10px 30px rgba(0,0,0,.04); }\n header { padding:1.25rem 1.5rem; background:#fff; border-bottom:1px solid var(--border); display:flex; gap:1rem; align-items:center; }\n .brand { font-weight:700; letter-spacing:.2px; font-size:1rem; color:var(--primary); }\n .sub { color:var(--muted); font-size:.9rem; }\n .grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:1rem; }\n .section { padding:1.25rem 1.5rem; }\n h1 { font-size:1.4rem; margin:.25rem 0 .5rem; letter-spacing:.2px; }\n h2 { font-size:1.1rem; margin:0 0 .75rem; color:var(--primary); }\n p { margin:.25rem 0; line-height:1.55; }\n .card { background:#fff; border:1px solid var(--border); border-radius:10px; padding:1rem; }\n .muted { color:var(--muted); }\n .kvs { display:grid; grid-template-columns:1fr 1fr; gap:.5rem 1rem; font-size:.95rem; }\n .kvs div { display:flex; align-items:center; gap:.5rem; }\n .pill { font-size:.8rem; padding:.15rem .5rem; border:1px solid var(--border); border-radius:999px; background:#f1f5f9; }\n table { width:100%; border-collapse:collapse; }\n th, td { border:1px solid var(--border); padding:.6rem .5rem; text-align:left; vertical-align:top; }\n thead th { background:#f1f5f9; }\n tfoot td { font-weight:600; }\n .note { font-size:.92rem; background:#f8fafc; border:1px dashed var(--border); padding:.75rem; border-radius:8px; }\n .cols-3 { columns:2; column-gap:1rem; }\n .signature { height:80px; border:1px dashed var(--border); border-radius:10px; display:flex; align-items:center; justify-content:center; color:var(--muted); }\n footer { padding:1rem 1.5rem; border-top:1px solid var(--border); color:var(--muted); font-size:.9rem; background:#fff; }\n </style>\n \n <body>\n <div class="page">\n \n {# === Raccourcis sûrs === #}\n {% set c = (quote.prospect is defined and quote.prospect.contact is defined) ? quote.prospect.contact : null %}\n {% set a = (c and c.mainAddress is defined) ? c.mainAddress : null %}\n {% set comp = (quote.prospect is defined and quote.prospect.company is defined) ? quote.prospect.company : null %}\n {% set lines = quote.quoteLines|default([]) %}\n {% set first = lines[0]|default(null) %}\n \n {# === Totaux/remise/TVA (fallbacks robustes) === #}\n {% set total_ht_before_discount = 0 %}\n {% for l in lines %}\n {% set q = l.quantity|default(1) %}\n {% set pu = l.unitPriceExclVat|default(0) %}\n {% set total_ht_before_discount = total_ht_before_discount + (q * pu) %}\n {% endfor %}\n {% if total_ht_before_discount == 0 %}\n {% set total_ht_before_discount = quote.totalExcludingVat|default(0) %}\n {% endif %}\n {% set total_ht = quote.totalExcludingVat|default(total_ht_before_discount) %}\n {% set discount_value = total_ht_before_discount - total_ht %}\n {% set discount_percent = total_ht_before_discount > 0 ? (discount_value / total_ht_before_discount * 100) : 0 %}\n {% set vat_total = 0 %}\n {% for l in lines %}\n {% set vat_total = vat_total + (l.vatAmount|default(0)) %}\n {% endfor %}\n \n <!-- HEADER -->\n <header>\n <div style="flex:1">\n <div class="brand">YANIGAV – Enfonce-pieux • Affûte-piquet • Fendeuse de bûche</div>\n <div class="sub">RCS ROANNE B 403 872 724 • SIRET 403 872 724 00014 • APE 4661Z • TVA FR114038727224</div>\n </div>\n <div class="pill">{{ (quote.createdAt|default('now'))|date('d F Y') }}</div>\n </header>\n \n <!-- COORDONNÉES -->\n <div class="section grid-2">\n <div class="card">\n <h2>Expéditeur</h2>\n <p><strong>YANIGAV</strong></p>\n <p>De la part de <strong>{{ managedBy.fullname|default(quote.managedByRealName|default('')) }}</strong> ({{ managedBy.role|default('Resp. Commercial') }})</p>\n <div class="kvs">\n <div><span class="pill">Tél</span> {{ managedBy.phone|default('—') }}</div>\n <div><span class="pill">Port</span> {{ managedBy.mobile|default('—') }}</div>\n <div><span class="pill">Email</span> {% if managedBy.email %}<a href="mailto:{{ managedBy.email }}">{{ managedBy.email }}</a>{% else %}—{% endif %}</div>\n </div>\n </div>\n <div class="card">\n <h2>Destinataire</h2>\n <p><strong>{{ quote.contactIdRealName|default(c.fullname|default(c.name|default(''))) }}</strong></p>\n {% if comp and comp.name %}<p><strong>{{ comp.name }}</strong></p>{% endif %}\n {% if a and (a.postalCode or a.city) %}<p class="muted">{{ a.postalCode|default('') }} {{ a.city|default('') }}</p>{% endif %}\n </div>\n </div>\n \n <!-- INTRO -->\n <div class="section">\n <div class="card">\n <h1>Proposition commerciale</h1>\n <p>{% if c and c.civility %}{{ c.civility }},{% else %}Madame, Monsieur,{% endif %}</p>\n <p>Nous vous remercions de l’intérêt que vous portez à la marque YANIGAV et à ses produits. Suite à votre récent appel téléphonique, voici notre proposition pour un <strong>{{ quote.name|default('Enfonce-pieux HYDROCHOC HPG 790') }}</strong> correspondant à votre demande.</p>\n {% if quote.priceListRef is defined and quote.priceListRef %}\n <p class="muted">{{ quote.priceListRef }}</p>\n {% else %}\n <p class="muted">Tarif — {{ (quote.createdAt|default('now'))|date('Y') }}</p>\n {% endif %}\n </div>\n </div>\n \n <!-- OFFRE PRINCIPALE (table 3 colonnes) -->\n <div class="section">\n <div class="card">\n <h2>Offre principale</h2>\n <table>\n <thead>\n <tr>\n <th>Désignation</th>\n <th>Référence</th>\n <th>Prix unitaire HT</th>\n </tr>\n </thead>\n <tbody>\n {% set pu = (first and first.unitPriceExclVat is defined) ? first.unitPriceExclVat : (total_ht_before_discount > 0 ? total_ht_before_discount : 0) %}\n <tr>\n <td>{{ first and first.name ? first.name : quote.name }}</td>\n <td>{{ first and first.reference ? first.reference : '—' }}</td>\n <td>{{ pu|number_format(0, ',', ' ') }} €</td>\n </tr>\n </tbody>\n </table>\n {% set note = first and first.description ? first.description : 'Cinématique unique sur le marché — un véritable atout dans les terrains compliqués.' %}\n <p class="note" style="margin-top:.75rem">{{ note }}</p>\n </div>\n </div>\n \n {# === SECTION DYNAMIQUE : Descriptif / Équipement / Formation / Options === #}\n {% set mainLine = (lines|filter(l => (not l.isOptional) and (l.reference is not defined or ('formation' not in l.reference|lower))))|first %}\n {% set formationLine = (lines|filter(l => (l.reference is defined and 'formation' in l.reference|lower)))|first %}\n {% set options = lines|filter(l => (l.isOptional))|list %}\n \n {% set description = mainLine and mainLine.description is defined ? mainLine.description|replace({'•':'\n',';':'\n'}) : '' %}\n {% set descList = description|split('\n')|map(v => v|trim)|filter(v => v != '') %}\n \n <div class="section grid-2">\n <div class="card">\n <h2>Points forts</h2>\n {% if descList|length > 0 %}\n <ul class="cols-3">\n {% for item in descList %}\n <li>{{ item }}</li>\n {% endfor %}\n </ul>\n {% else %}\n <p class="muted">Aucun détail technique renseigné pour cet article.</p>\n {% endif %}\n </div>\n \n <div class="card">\n <h2>Équipement de série</h2>\n {# 1) Si le backend fournit explicitement une liste d'équipements #}\n {% if mainLine and mainLine.features is defined and mainLine.features|length > 0 %}\n <ul>\n {% for f in mainLine.features %}<li>{{ f }}</li>{% endfor %}\n </ul>\n {% else %}\n {# 2) Sinon, on tente d’extraire une sous-liste depuis la description #}\n {% set equipCandidates = [] %}\n {% for item in descList %}\n {% if item matches '/(équipement|equipement|de série|serie)/i' %}\n {% set equipCandidates = equipCandidates|merge([item]) %}\n {% endif %}\n {% endfor %}\n {% if equipCandidates|length > 0 %}\n <ul>\n {% for f in equipCandidates %}<li>{{ f }}</li>{% endfor %}\n </ul>\n {% else %}\n <p class="muted">Aucun équipement de série spécifié.</p>\n {% endif %}\n {% endif %}\n \n {% if formationLine %}\n <h2 style="margin-top:1rem">Formation / Mise en route</h2>\n <p><strong>{{ formationLine.name|default('Formation / Mise en route') }}</strong> – Prix net :\n {{ (formationLine.totalExclVat|default(formationLine.unitPriceExclVat|default(0)))|number_format(0, ',', ' ') }} € HT</p>\n {% if formationLine.description %}<p class="muted">{{ formationLine.description }}</p>{% endif %}\n {% endif %}\n \n {% if options|length > 0 %}\n <h2 style="margin-top:1rem">Équipements recommandés</h2>\n <ul>\n {% for opt in options %}\n {% set opt_total = opt.totalExclVat|default(opt.quantity|default(1) * opt.unitPriceExclVat|default(0) * (1 - (opt.discountPercent|default(0) / 100))) %}\n <li>{{ opt.name }} — {{ opt_total|number_format(0, ',', ' ') }} € HT</li>\n {% endfor %}\n </ul>\n {% endif %}\n </div>\n </div>\n \n <!-- CONDITIONS COMMERCIALES -->\n <div class="section">\n <div class="card">\n <h2>Conditions commerciales</h2>\n <ul>\n {% if quote.expiredAt %}<li>Validité de l’offre : 1 mois (jusqu’au {{ quote.expiredAt|date('d/m/Y') }})</li>{% else %}<li>Validité de l’offre : 1 mois</li>{% endif %}\n {% if discount_value > 0 %}<li>Remise de service : {{ discount_percent|round(0, 'floor') }} %</li>{% endif %}\n {% if quote.orderContext is defined and quote.orderContext %}<li>{{ quote.orderContext }}</li>{% endif %}\n <li>Règlement {{ quote.paymentMode|default('30 jours nets par LCR') }}</li>\n <li>Délai : {{ quote.leadTime|default('2 à 3 mois après commande') }}</li>\n {% if quote.shippingFeesHt is defined %}\n {% if quote.shippingFeesHt == 0 %}<li>Port franco</li>\n {% elseif quote.shippingFeesHt > 0 %}<li>Frais de port : {{ quote.shippingFeesHt|number_format(2, ',', ' ') }} € HT</li>\n {% else %}<li>Port : {{ quote.shippingMode|default('selon conditions') }}</li>\n {% endif %}\n {% else %}\n <li>Port : {{ quote.shippingMode|default('selon conditions') }}</li>\n {% endif %}\n {% if quote.customerRef is defined and quote.customerRef %}<li>Réf. client : {{ quote.customerRef }}</li>{% endif %}\n </ul>\n </div>\n </div>\n \n <!-- SIGNATURES -->\n <div class="section grid-2">\n <div class="card">\n <h2>Signataires</h2>\n <p><strong>{{ managedBy.fullname|default(quote.managedByRealName|default('')) }}</strong> – {{ managedBy.role|default('Resp. Commercial') }}{% if managedBy.mobile %} – {{ managedBy.mobile }}{% endif %}</p>\n <div class="signature">Signature expéditeur</div>\n </div>\n <div class="card">\n <h2>Bon pour accord</h2>\n <p><strong>{{ quote.contactIdRealName|default(c.fullname|default(c.name|default(''))) }}</strong>{% if comp and comp.name %} – {{ comp.name }}{% endif %}</p>\n <div class="signature">Cachet et signature</div>\n </div>\n </div>\n \n <!-- PIED -->\n <footer>\n YANIGAV – Enfonce-pieux • Affûte-piquet • Fendeuse de bûche — RCS ROANNE B 403 872 724 — SIRET 403 872 724 00014 — APE 4661Z — TVA FR114038727224\n </footer>\n </div>\n \n {# === PAGE 2 (optionnelle) : CGV === #}\n {% if cgv is defined or quote.cgvText is defined %}\n <div style="page-break-before:always;"></div>\n <div class="page">\n <div class="section">\n <div class="card">\n <h2>Conditions Générales de Vente</h2>\n <div class="note" style="white-space:pre-wrap">\n {{ cgv|default(quote.cgvText)|raw }}\n </div>\n </div>\n </div>\n <footer>\n Document généré automatiquement — valable sous réserve des conditions précisées ci-dessus.\n </footer>\n </div>\n {% endif %}\n </body>\n </html> """ #message: "Unknown "list" filter. Did you mean "last" in "quote_pdf (string template 1ba51d88cc7b7b4c077dceaafdbd99029f38167d77930ef9228cb7697e5426a6)" at line 133?" #code: 0 #file: "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/releases/20251009101152/application/vendor/twig/twig/src/ExpressionParser.php" #line: 788 : { { Twig\ExpressionParser->getFilterNodeClass(string $name, int $line): string … › |
logger | Symfony\Bridge\Monolog\Logger {#1521 #name: "request" #handlers: [ Monolog\Handler\RotatingFileHandler {#1507 #filename: "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/shared/application/var/log/dev.log" #maxFiles: 14 #mustRotate: false #nextRotation: DateTime @1760997600 {#1508 : 2025-10-21 00:00:00.0 Europe/Paris (+02:00) } #filenameFormat: "{filename}-{date}" #dateFormat: "Y-m-d" #stream: stream resource @2436 : false : true : false : "plainfile" : "STDIO" : "a" : 0 : true : "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/shared/application/var/log/dev-2025-10-20.log" : [] } #url: "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/shared/application/var/log/dev-2025-10-20.log" -errorMessage: null #filePermission: null #useLocking: false -dirCreated: true #level: 100 #bubble: true #formatter: Monolog\Formatter\LineFormatter {#390 …} #processors: [ Monolog\Processor\PsrLogMessageProcessor {#1690} ] } Symfony\Bridge\Monolog\Handler\ConsoleHandler {#1520 -output: null -verbosityLevelMap: [ 16 => 400 32 => 300 64 => 250 128 => 200 256 => 100 ] -consoleFormaterOptions: [] #level: 100 #bubble: true #formatter: null #processors: [] } Monolog\Handler\FingersCrossedHandler {#1696 #handler: Monolog\Handler\BufferHandler {#1687 …} #activationStrategy: Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy {#1650 …} #buffering: false #bufferSize: 0 #buffer: [] #stopBuffering: true #passthruLevel: null #level: 100 #bubble: true #formatter: null #processors: [] } ] #processors: [ App\Service\Monolog\ELKProcessor {#1701 -applicationName: "pol-middleware" -applicationEnvironment: "dev" } Symfony\Bridge\Monolog\Processor\DebugProcessor {#1689 -records: [ "0000000055f4a2d30000000033fa16c9" => [ [ "timestamp" => 1760912746 "message" => "Matched route "{route}"." "priority" => 200 "priorityName" => "INFO" "context" => [ "route" => "quote_generate_pdf" "route_parameters" => [ "_route" => "quote_generate_pdf" "_controller" => "App\Controller\Quote\QuoteController::generateQuotePdf" "id" => "quote_188395" ] "request_uri" => "https://dev.app.pol-crm.com/api/quote/quote_188395/generatepdf" "method" => "POST" ] "channel" => "request" ] [ "timestamp" => 1760912746 "message" => "Checking for guard authentication credentials." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "firewall_key" => "api" "authenticators" => 1 ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Checking support on guard authenticator." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "firewall_key" => "api" "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Calling getCredentials() on guard authenticator." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "firewall_key" => "api" "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Passing guard token information to the GuardAuthenticationProvider" "priority" => 100 "priorityName" => "DEBUG" "context" => [ "firewall_key" => "api" "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "lexik_jwt_authentication.on_jwt_authenticated" "listener" => "App\V4\EventSubscriber\PreventMultipleLoginsEventSubscriber::onJWTAuthenticated" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Guard authentication successful!" "priority" => 200 "priorityName" => "INFO" "context" => [ "token" => Lexik\Bundle\JWTAuthenticationBundle\Security\Authentication\Token\JWTUserToken {#496 #rawToken: "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NjA5MTI0NDEsImV4cCI6MTc2MDkxNjA0MSwicm9sZXMiOlsiUk9MRV9VU0VSIiwiUk9MRV9TVVBFUkFETUlOIiwiUk9MRV9BRE1JTiIsIlJPTEVfTU9EVUxFX1BST0RVQ1QiLCJST0xFX01PRFVMRV9QUk9EVUNUX0NVU1RPTUlaRSIsIlJPTEVfTU9EVUxFX1FVT1RFX0xJTkUiLCJQUk9TUEVDVF9TSE9XIiwiUFJPU1BFQ1RfQ1VEIiwiQ09OVEFDVF9DVUQiLCJDT05UQUNUX1NIT1ciLCJUQVNLX1NIT1ciLCJUQVNLX0NVRCIsIlFVT1RFX1NIT1ciLCJRVU9URV9DVUQiLCJRVU9URV9SRUdFTkVSQVRFX1BSSUNFUyJdLCJsb2dpbiI6ImRlbW95YW5pZ2F2IiwidXNlcl9pZCI6InVzZXJfMTAxMSIsInVzZXJfZXh0ZXJuYWxfaWQiOiIxMDExIiwiZW1haWwiOiJnLXNhdXRyb25Ac2ZpLmZyIiwiY3VzdG9tZXJfaWQiOiJjdXN0b21lcl8xMjEiLCJjdXN0b21lcl9uYW1lIjoiWUFOSUdBViIsImN1c3RvbWVyX2V4dGVybmFsX2lkIjoiMTIxIiwiY3VzdG9tZXJfbWFpbGluZ19pZCI6IjE0NyIsImZpcnN0bmFtZSI6Ikd1aWxsYXVtZSIsImxhc3RuYW1lIjoiU0FVVFJPTiIsImxpdmVvTG9naW4iOm51bGwsImxpdmVvUGFzc3dvcmQiOm51bGwsImhhc0ludHJhbmV0IjpmYWxzZSwibGFuZ3VhZ2UiOiJGUiIsInNlY3Rpb25zX2xlYWRlZCI6W10sInNlY3Rpb25zX21lbWJlcnMiOlsidXNlcl8xMDExIl0sImlzX3NlY3Rpb25zX2FjdGl2YXRlZCI6ZmFsc2UsInJlZnJlc2hfdG9rZW4iOiIifQ.smruhTDO6MF4efpXGiPp4DyZoLSpsUh3ykwBDmscLGtkvlySQlnSFvS1bxozG8T5Y0oGdkijvDiliogWK_zhqLF6FXho-oEscgCbKhvTjdosGLc4QHX0QAtM1LeVpT3BGVz9isHY1J7X0RDnoWA2GdCwCZ-ELXlS7fP08w_Mc5j8GqGhN5XwD70MLfR5ltD75o5BEhCWKMsWsatkGs3bbd7AfjhqoSz7qexpiHj1BRszq-H5QekWiJWgwOLDUJc85rZYaNVbYu75qseEbKfW-kWAxOZhAZCmVfFDQ-qBxSJ1i7KwVasIGTJDTnJn7l8fDqFWF0jGtC4LJzQEOZDjoOrQVaP2szLusNdOeKICnE3GOpY7E2sHIJpbTf8KlRUSm0uKc4t4hgoSRxnCdQGLx4hcTGSGHyITgso7tVs6068piCfp8JttEo5SoXERPiVNl2oeKa7VQAgtUWMzPI-SYX6QfGCjnrYE3JcTufx8xFtvlS4pmeIaLNJs7Y8l21f-A8MB7y-3zOAzriYExuKUOtT9oZ0GRtCWG5oTUyQ2LI4IjzaqBW_ikRfcccdSOZqZxV_FVw1fO9vPg9Lgi9XKAfKtjCLtI9nMboiZsSk9mx5_CAREqtb476hnnUVOfvHCBazVRQo-FWsSSWNLCIe8MtR9pUny0D8hn5qCQ712Axk" #providerKey: "api" -user: App\Security\User {#424 …} -roles: [ Symfony\Component\Security\Core\Role\Role {#759 -role: "ROLE_USER" } Symfony\Component\Security\Core\Role\Role {#761 -role: "ROLE_SUPERADMIN" } Symfony\Component\Security\Core\Role\Role {#760 -role: "ROLE_ADMIN" } Symfony\Component\Security\Core\Role\Role {#474 -role: "ROLE_MODULE_PRODUCT" } Symfony\Component\Security\Core\Role\Role {#762 -role: "ROLE_MODULE_PRODUCT_CUSTOMIZE" } Symfony\Component\Security\Core\Role\Role {#763 -role: "ROLE_MODULE_QUOTE_LINE" } Symfony\Component\Security\Core\Role\Role {#764 -role: "PROSPECT_SHOW" } Symfony\Component\Security\Core\Role\Role {#765 -role: "PROSPECT_CUD" } Symfony\Component\Security\Core\Role\Role {#766 -role: "CONTACT_CUD" } Symfony\Component\Security\Core\Role\Role {#767 -role: "CONTACT_SHOW" } Symfony\Component\Security\Core\Role\Role {#768 -role: "TASK_SHOW" } Symfony\Component\Security\Core\Role\Role {#769 -role: "TASK_CUD" } Symfony\Component\Security\Core\Role\Role {#770 -role: "QUOTE_SHOW" } Symfony\Component\Security\Core\Role\Role {#771 -role: "QUOTE_CUD" } Symfony\Component\Security\Core\Role\Role {#772 -role: "QUOTE_REGENERATE_PRICES" } ] -roleNames: [ "ROLE_USER" "ROLE_SUPERADMIN" "ROLE_ADMIN" "ROLE_MODULE_PRODUCT" "ROLE_MODULE_PRODUCT_CUSTOMIZE" "ROLE_MODULE_QUOTE_LINE" "PROSPECT_SHOW" "PROSPECT_CUD" "CONTACT_CUD" "CONTACT_SHOW" "TASK_SHOW" "TASK_CUD" "QUOTE_SHOW" "QUOTE_CUD" "QUOTE_REGENERATE_PRICES" ] -authenticated: true -attributes: [] } "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Guard authenticator set no success response: request continues." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Remember me skipped: it is not configured for the firewall." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "authenticator" => "App\Security\JWTTokenWhitelistAuthenticator" ] "channel" => "security" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\V4\Dev\EventSubscriber\DisableProfilerOnProfilerEventSubscriber::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\EventListener\DebugRequestListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\EventListener\DebugRequestListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Nelmio\CorsBundle\EventListener\CorsListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\EventListener\RequestListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::resolveControllerName" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\Filter\QueryParameterValidateListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\EventListener\AddFormatListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\DoctrineFilter\CustomerFilterEventSubscriber::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Sentry\SentryBundle\EventListener\RequestListener::handleKernelRequestEvent" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\EventListener\ReadListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Sentry\SentryBundle\EventListener\TracingRequestListener::handleKernelRequestEvent" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\Security\EventListener\DenyAccessListener::onSecurity" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Sentry\SentryBundle\EventListener\SubRequestListener::handleKernelRequestEvent" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\EventListener\DeserializeListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Sentry\SentryBundle\EventListener\TracingSubRequestListener::handleKernelRequestEvent" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\Security\EventListener\DenyAccessListener::onSecurityPostDenormalize" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "ApiPlatform\Core\Bridge\Symfony\Bundle\EventListener\SwaggerUiListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "App\V4\EventSubscriber\Sentry\RegisterTransactionIdEventSubscriber::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.request" "listener" => "Stof\DoctrineExtensionsBundle\EventListener\BlameListener::onKernelRequest" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Sentry\SentryBundle\EventListener\RequestListener::handleKernelControllerEvent" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\HttpCacheListener::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller_arguments" "listener" => "Symfony\Component\HttpKernel\EventListener\ErrorListener::onControllerArguments" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller_arguments" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\SecurityListener::onKernelControllerArguments" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "kernel.controller_arguments" "listener" => "Sensio\Bundle\FrameworkExtraBundle\EventListener\IsGrantedListener::onKernelControllerArguments" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Notified event "{event}" to listener "{listener}"." "priority" => 100 "priorityName" => "DEBUG" "context" => [ "event" => "debug.security.authorization.vote" "listener" => "Symfony\Bundle\SecurityBundle\EventListener\VoteListener::onVoterVote" ] "channel" => "event" ] [ "timestamp" => 1760912746 "message" => "Request: "GET http://dev.pol-api-business.pol-crm.com/api/quotes/quote_188395?customerId=customer_121"" "priority" => 200 "priorityName" => "INFO" "context" => [] "channel" => "http_client" ] [ "timestamp" => 1760912746 "message" => "Response: "200 http://dev.pol-api-business.pol-crm.com/api/quotes/quote_188395?customerId=customer_121"" "priority" => 200 "priorityName" => "INFO" "context" => [] "channel" => "http_client" ] [ "timestamp" => 1760912746 "message" => "Request: "GET http://dev.pol-api-param.pol-crm.com/api/templates/f47ef469dac34bc29180feb40a25724c"" "priority" => 200 "priorityName" => "INFO" "context" => [] "channel" => "http_client" ] [ "timestamp" => 1760912747 "message" => "Response: "200 http://dev.pol-api-param.pol-crm.com/api/templates/f47ef469dac34bc29180feb40a25724c"" "priority" => 200 "priorityName" => "INFO" "context" => [] "channel" => "http_client" ] [ "timestamp" => 1760912747 "message" => "Uncaught PHP Exception Twig\Error\SyntaxError: "Unknown "list" filter. Did you mean "last" in "quote_pdf (string template 1ba51d88cc7b7b4c077dceaafdbd99029f38167d77930ef9228cb7697e5426a6)" at line 133?" at /var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/releases/20251009101152/application/vendor/twig/twig/src/ExpressionParser.php line 788" "priority" => 500 "priorityName" => "CRITICAL" "context" => [ "exception" => Twig\Error\SyntaxError {#4420 -lineno: 133 -name: "quote_pdf (string template 1ba51d88cc7b7b4c077dceaafdbd99029f38167d77930ef9228cb7697e5426a6)" -rawMessage: "Unknown "list" filter. Did you mean "last"?" -sourcePath: "" -sourceCode: """ <!doctype html>\n <html lang="fr">\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1">\n <title>Devis – YANIGAV – {{ quote.name|default('Enfonce-pieux HYDROCHOC HPG 790') }}</title>\n <style>\n :root { --primary:#0f172a; --muted:#475569; --border:#e2e8f0; --bg:#f8fafc; }\n html, body { margin:0; padding:0; background:var(--bg); color:#0b1220; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji"; }\n .page { max-width:900px; margin:2rem auto; background:#fff; border:1px solid var(--border); border-radius:12px; overflow:hidden; box-shadow:0 10px 30px rgba(0,0,0,.04); }\n header { padding:1.25rem 1.5rem; background:#fff; border-bottom:1px solid var(--border); display:flex; gap:1rem; align-items:center; }\n .brand { font-weight:700; letter-spacing:.2px; font-size:1rem; color:var(--primary); }\n .sub { color:var(--muted); font-size:.9rem; }\n .grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:1rem; }\n .section { padding:1.25rem 1.5rem; }\n h1 { font-size:1.4rem; margin:.25rem 0 .5rem; letter-spacing:.2px; }\n h2 { font-size:1.1rem; margin:0 0 .75rem; color:var(--primary); }\n p { margin:.25rem 0; line-height:1.55; }\n .card { background:#fff; border:1px solid var(--border); border-radius:10px; padding:1rem; }\n .muted { color:var(--muted); }\n .kvs { display:grid; grid-template-columns:1fr 1fr; gap:.5rem 1rem; font-size:.95rem; }\n .kvs div { display:flex; align-items:center; gap:.5rem; }\n .pill { font-size:.8rem; padding:.15rem .5rem; border:1px solid var(--border); border-radius:999px; background:#f1f5f9; }\n table { width:100%; border-collapse:collapse; }\n th, td { border:1px solid var(--border); padding:.6rem .5rem; text-align:left; vertical-align:top; }\n thead th { background:#f1f5f9; }\n tfoot td { font-weight:600; }\n .note { font-size:.92rem; background:#f8fafc; border:1px dashed var(--border); padding:.75rem; border-radius:8px; }\n .cols-3 { columns:2; column-gap:1rem; }\n .signature { height:80px; border:1px dashed var(--border); border-radius:10px; display:flex; align-items:center; justify-content:center; color:var(--muted); }\n footer { padding:1rem 1.5rem; border-top:1px solid var(--border); color:var(--muted); font-size:.9rem; background:#fff; }\n </style>\n \n <body>\n <div class="page">\n \n {# === Raccourcis sûrs === #}\n {% set c = (quote.prospect is defined and quote.prospect.contact is defined) ? quote.prospect.contact : null %}\n {% set a = (c and c.mainAddress is defined) ? c.mainAddress : null %}\n {% set comp = (quote.prospect is defined and quote.prospect.company is defined) ? quote.prospect.company : null %}\n {% set lines = quote.quoteLines|default([]) %}\n {% set first = lines[0]|default(null) %}\n \n {# === Totaux/remise/TVA (fallbacks robustes) === #}\n {% set total_ht_before_discount = 0 %}\n {% for l in lines %}\n {% set q = l.quantity|default(1) %}\n {% set pu = l.unitPriceExclVat|default(0) %}\n {% set total_ht_before_discount = total_ht_before_discount + (q * pu) %}\n {% endfor %}\n {% if total_ht_before_discount == 0 %}\n {% set total_ht_before_discount = quote.totalExcludingVat|default(0) %}\n {% endif %}\n {% set total_ht = quote.totalExcludingVat|default(total_ht_before_discount) %}\n {% set discount_value = total_ht_before_discount - total_ht %}\n {% set discount_percent = total_ht_before_discount > 0 ? (discount_value / total_ht_before_discount * 100) : 0 %}\n {% set vat_total = 0 %}\n {% for l in lines %}\n {% set vat_total = vat_total + (l.vatAmount|default(0)) %}\n {% endfor %}\n \n <!-- HEADER -->\n <header>\n <div style="flex:1">\n <div class="brand">YANIGAV – Enfonce-pieux • Affûte-piquet • Fendeuse de bûche</div>\n <div class="sub">RCS ROANNE B 403 872 724 • SIRET 403 872 724 00014 • APE 4661Z • TVA FR114038727224</div>\n </div>\n <div class="pill">{{ (quote.createdAt|default('now'))|date('d F Y') }}</div>\n </header>\n \n <!-- COORDONNÉES -->\n <div class="section grid-2">\n <div class="card">\n <h2>Expéditeur</h2>\n <p><strong>YANIGAV</strong></p>\n <p>De la part de <strong>{{ managedBy.fullname|default(quote.managedByRealName|default('')) }}</strong> ({{ managedBy.role|default('Resp. Commercial') }})</p>\n <div class="kvs">\n <div><span class="pill">Tél</span> {{ managedBy.phone|default('—') }}</div>\n <div><span class="pill">Port</span> {{ managedBy.mobile|default('—') }}</div>\n <div><span class="pill">Email</span> {% if managedBy.email %}<a href="mailto:{{ managedBy.email }}">{{ managedBy.email }}</a>{% else %}—{% endif %}</div>\n </div>\n </div>\n <div class="card">\n <h2>Destinataire</h2>\n <p><strong>{{ quote.contactIdRealName|default(c.fullname|default(c.name|default(''))) }}</strong></p>\n {% if comp and comp.name %}<p><strong>{{ comp.name }}</strong></p>{% endif %}\n {% if a and (a.postalCode or a.city) %}<p class="muted">{{ a.postalCode|default('') }} {{ a.city|default('') }}</p>{% endif %}\n </div>\n </div>\n \n <!-- INTRO -->\n <div class="section">\n <div class="card">\n <h1>Proposition commerciale</h1>\n <p>{% if c and c.civility %}{{ c.civility }},{% else %}Madame, Monsieur,{% endif %}</p>\n <p>Nous vous remercions de l’intérêt que vous portez à la marque YANIGAV et à ses produits. Suite à votre récent appel téléphonique, voici notre proposition pour un <strong>{{ quote.name|default('Enfonce-pieux HYDROCHOC HPG 790') }}</strong> correspondant à votre demande.</p>\n {% if quote.priceListRef is defined and quote.priceListRef %}\n <p class="muted">{{ quote.priceListRef }}</p>\n {% else %}\n <p class="muted">Tarif — {{ (quote.createdAt|default('now'))|date('Y') }}</p>\n {% endif %}\n </div>\n </div>\n \n <!-- OFFRE PRINCIPALE (table 3 colonnes) -->\n <div class="section">\n <div class="card">\n <h2>Offre principale</h2>\n <table>\n <thead>\n <tr>\n <th>Désignation</th>\n <th>Référence</th>\n <th>Prix unitaire HT</th>\n </tr>\n </thead>\n <tbody>\n {% set pu = (first and first.unitPriceExclVat is defined) ? first.unitPriceExclVat : (total_ht_before_discount > 0 ? total_ht_before_discount : 0) %}\n <tr>\n <td>{{ first and first.name ? first.name : quote.name }}</td>\n <td>{{ first and first.reference ? first.reference : '—' }}</td>\n <td>{{ pu|number_format(0, ',', ' ') }} €</td>\n </tr>\n </tbody>\n </table>\n {% set note = first and first.description ? first.description : 'Cinématique unique sur le marché — un véritable atout dans les terrains compliqués.' %}\n <p class="note" style="margin-top:.75rem">{{ note }}</p>\n </div>\n </div>\n \n {# === SECTION DYNAMIQUE : Descriptif / Équipement / Formation / Options === #}\n {% set mainLine = (lines|filter(l => (not l.isOptional) and (l.reference is not defined or ('formation' not in l.reference|lower))))|first %}\n {% set formationLine = (lines|filter(l => (l.reference is defined and 'formation' in l.reference|lower)))|first %}\n {% set options = lines|filter(l => (l.isOptional))|list %}\n \n {% set description = mainLine and mainLine.description is defined ? mainLine.description|replace({'•':'\n',';':'\n'}) : '' %}\n {% set descList = description|split('\n')|map(v => v|trim)|filter(v => v != '') %}\n \n <div class="section grid-2">\n <div class="card">\n <h2>Points forts</h2>\n {% if descList|length > 0 %}\n <ul class="cols-3">\n {% for item in descList %}\n <li>{{ item }}</li>\n {% endfor %}\n </ul>\n {% else %}\n <p class="muted">Aucun détail technique renseigné pour cet article.</p>\n {% endif %}\n </div>\n \n <div class="card">\n <h2>Équipement de série</h2>\n {# 1) Si le backend fournit explicitement une liste d'équipements #}\n {% if mainLine and mainLine.features is defined and mainLine.features|length > 0 %}\n <ul>\n {% for f in mainLine.features %}<li>{{ f }}</li>{% endfor %}\n </ul>\n {% else %}\n {# 2) Sinon, on tente d’extraire une sous-liste depuis la description #}\n {% set equipCandidates = [] %}\n {% for item in descList %}\n {% if item matches '/(équipement|equipement|de série|serie)/i' %}\n {% set equipCandidates = equipCandidates|merge([item]) %}\n {% endif %}\n {% endfor %}\n {% if equipCandidates|length > 0 %}\n <ul>\n {% for f in equipCandidates %}<li>{{ f }}</li>{% endfor %}\n </ul>\n {% else %}\n <p class="muted">Aucun équipement de série spécifié.</p>\n {% endif %}\n {% endif %}\n \n {% if formationLine %}\n <h2 style="margin-top:1rem">Formation / Mise en route</h2>\n <p><strong>{{ formationLine.name|default('Formation / Mise en route') }}</strong> – Prix net :\n {{ (formationLine.totalExclVat|default(formationLine.unitPriceExclVat|default(0)))|number_format(0, ',', ' ') }} € HT</p>\n {% if formationLine.description %}<p class="muted">{{ formationLine.description }}</p>{% endif %}\n {% endif %}\n \n {% if options|length > 0 %}\n <h2 style="margin-top:1rem">Équipements recommandés</h2>\n <ul>\n {% for opt in options %}\n {% set opt_total = opt.totalExclVat|default(opt.quantity|default(1) * opt.unitPriceExclVat|default(0) * (1 - (opt.discountPercent|default(0) / 100))) %}\n <li>{{ opt.name }} — {{ opt_total|number_format(0, ',', ' ') }} € HT</li>\n {% endfor %}\n </ul>\n {% endif %}\n </div>\n </div>\n \n <!-- CONDITIONS COMMERCIALES -->\n <div class="section">\n <div class="card">\n <h2>Conditions commerciales</h2>\n <ul>\n {% if quote.expiredAt %}<li>Validité de l’offre : 1 mois (jusqu’au {{ quote.expiredAt|date('d/m/Y') }})</li>{% else %}<li>Validité de l’offre : 1 mois</li>{% endif %}\n {% if discount_value > 0 %}<li>Remise de service : {{ discount_percent|round(0, 'floor') }} %</li>{% endif %}\n {% if quote.orderContext is defined and quote.orderContext %}<li>{{ quote.orderContext }}</li>{% endif %}\n <li>Règlement {{ quote.paymentMode|default('30 jours nets par LCR') }}</li>\n <li>Délai : {{ quote.leadTime|default('2 à 3 mois après commande') }}</li>\n {% if quote.shippingFeesHt is defined %}\n {% if quote.shippingFeesHt == 0 %}<li>Port franco</li>\n {% elseif quote.shippingFeesHt > 0 %}<li>Frais de port : {{ quote.shippingFeesHt|number_format(2, ',', ' ') }} € HT</li>\n {% else %}<li>Port : {{ quote.shippingMode|default('selon conditions') }}</li>\n {% endif %}\n {% else %}\n <li>Port : {{ quote.shippingMode|default('selon conditions') }}</li>\n {% endif %}\n {% if quote.customerRef is defined and quote.customerRef %}<li>Réf. client : {{ quote.customerRef }}</li>{% endif %}\n </ul>\n </div>\n </div>\n \n <!-- SIGNATURES -->\n <div class="section grid-2">\n <div class="card">\n <h2>Signataires</h2>\n <p><strong>{{ managedBy.fullname|default(quote.managedByRealName|default('')) }}</strong> – {{ managedBy.role|default('Resp. Commercial') }}{% if managedBy.mobile %} – {{ managedBy.mobile }}{% endif %}</p>\n <div class="signature">Signature expéditeur</div>\n </div>\n <div class="card">\n <h2>Bon pour accord</h2>\n <p><strong>{{ quote.contactIdRealName|default(c.fullname|default(c.name|default(''))) }}</strong>{% if comp and comp.name %} – {{ comp.name }}{% endif %}</p>\n <div class="signature">Cachet et signature</div>\n </div>\n </div>\n \n <!-- PIED -->\n <footer>\n YANIGAV – Enfonce-pieux • Affûte-piquet • Fendeuse de bûche — RCS ROANNE B 403 872 724 — SIRET 403 872 724 00014 — APE 4661Z — TVA FR114038727224\n </footer>\n </div>\n \n {# === PAGE 2 (optionnelle) : CGV === #}\n {% if cgv is defined or quote.cgvText is defined %}\n <div style="page-break-before:always;"></div>\n <div class="page">\n <div class="section">\n <div class="card">\n <h2>Conditions Générales de Vente</h2>\n <div class="note" style="white-space:pre-wrap">\n {{ cgv|default(quote.cgvText)|raw }}\n </div>\n </div>\n </div>\n <footer>\n Document généré automatiquement — valable sous réserve des conditions précisées ci-dessus.\n </footer>\n </div>\n {% endif %}\n </body>\n </html> """ #message: "Unknown "list" filter. Did you mean "last" in "quote_pdf (string template 1ba51d88cc7b7b4c077dceaafdbd99029f38167d77930ef9228cb7697e5426a6)" at line 133?" #code: 0 #file: "/var/www/vhosts/app.pol-crm.com/httpdocs/app-pol-crm/dev/releases/20251009101152/application/vendor/twig/twig/src/ExpressionParser.php" #line: 788 : { { Twig\ExpressionParser->getFilterNodeClass(string $name, int $line): string … › |