Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Empty PDF voucher #87

Open
JoeriE opened this issue Jul 11, 2022 · 10 comments
Open

Empty PDF voucher #87

JoeriE opened this issue Jul 11, 2022 · 10 comments

Comments

@JoeriE
Copy link

JoeriE commented Jul 11, 2022

Describe the bug

I attach a PDF voucher to my order confirmation emails immediately after an order is finished. The PDF voucher is always blank. If I resend the confirmation mail via the admin, the PDF voucher is correct.

It seems that the codes are not found. If I loop through the code, it always shows 'No code found' after the automatic email.

{% for code in codes %}
  {# PDF template #}
{% else %}
  No code found
{% endfor %}

Steps to reproduce

  1. Attach PDF to email that is directly send after order is completed.

Craft CMS version

3.7.34

Plugin version

2.7.4

Multi-site?

No

Additional context

No response

@engram-design
Copy link
Member

When you say I attach a PDF voucher to my order confirmation emails immediately after an order is finished how do you do this? Through the plugins Settings > Emails, or are you doing this yourself via events?

Secondly how is your queue being processed (where Commerce sends the emails), from a web request, automatically, or via the CLI? There should be no real difference between the methods.

@JoeriE
Copy link
Author

JoeriE commented Jul 11, 2022

@engram-design It's all just Craft Commerce settings. These are the settings of the e-mail which the PDF is attached to:
image

And this e-mail is sent when an order get status 'New', which is de default order status. So an order gets that status after the payment is done and the order is finished.

image

@engram-design
Copy link
Member

Right, but are you also attaching the Gift Voucher PDF using these settings?
image

@JoeriE
Copy link
Author

JoeriE commented Jul 12, 2022

@engram-design
Yes, I attached the gift voucher PDF using these settings. The PDF is empty when the email is sent automatically after an order is confirmed. If I go to the Admin > Commerce > Order and I click 'Send email' the PDF is correct.

@engram-design
Copy link
Member

Okay, thanks. Can you please let me know how your queue is run? The fact that you don't have blank PDFs with run via Commerce > Order tells me that it's a difference when the emails are sent via the queue. Sending the email through the control panel doesn't use the queue, which is why it seems to work. Something must be different in your queue setup.

Can you also show me your full Twig template used in your PDF, in case there's something not right there?

@JoeriE
Copy link
Author

JoeriE commented Jul 12, 2022

@engram-design I didn't change anything how the queue is going. The queue is automatically running after an order so the e-mail is sent immediately.

This is my full twig template:

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <style>
        html {
            margin: 0px !important;
        }

        @page {
            margin: 0px;
        }

        body {
            font-family: Times, 'Times New Roman', serif;
            font-size: 18px;
            line-height: 1.4em;
            margin: 0px;
            color: #8FA8C2;
        }

        * {
          box-sizing: border-box;
        }

        h1, h2, h3, h4, h5, .h1, .h2, .h3, .h4, .h5{
          font-family: Times, 'Times New Roman', serif;
          font-weight: 400;
        }

        h1,
        .h1 {
          text-transform: uppercase;
          font-size: 30px;
        }

        h2,
        .h2 {
          font-size: 24px;
        }

        .voucher {
            width: 100%;
            height: 4in;
            position: relative;
            display: block;
            background-color: #F8F5F1;
        }

        .voucher-img {
          width: 40%;
          height: 100%;
          display: block;
          background-size: cover;
        }

        .voucher-content {
          width: 60%;
          padding: 30px;
          display: block;
          margin-left: 40%;
          margin-top: -4in;
        }

    </style>
</head>

<body>

{% for code in codes %}
  <div style="margin-bottom: 30px; clear: both; page-break-after: always;">
    <div class="voucher">
        {% set url = labels.labels.giftCardImage.one().setTransform({width: 800}) %}
        <div class="voucher-img" style="background-image: url(data:image/jpg;base64,{{ image64(url) }});"></div>

        <div class="voucher-content">
          <h1>Nimzu cadeaubon</h1>

          <br>

          <div class="field-amount">
              ter waarde van
              <span class="h2">{{ code.currentAmount | commerceCurrency('EUR', stripZeros=true) }}</span>
          </div>

          <br>

          <div class="field-content">
              <div class="field-code">
                in te wisselen via de webshop <br>
                met coupon code: <span class="h2">{{ code.codeKey }}</span>
              </div>

              <br>

              {% if code.expiryDate %}
                  <div class="field-expiry">geldig tot en met {{ code.expiryDate | date("d/m/Y") }}</div>
              {% endif %}
          </div>
        </div>
     </div>
    </div>
{% endfor %}

</body>
</html>

@engram-design
Copy link
Member

Okay, so the default behaviour is to use a web request, and the queue being sent automatically. Just good to know as sometimes people run the queue from the command line, and that can make a difference.

I still can't replicate this, but must have something to do with this not working

if (!$codes && $order) {
$codesQuery = Code::find()
->orderId($order->id);
if ($lineItem) {
$codesQuery->lineItemId = $lineItem->id;
}
$codes = $codesQuery->all();
}

@WHITE-developer
Copy link

@engram-design seeing the same after a Craft 4 update,
It looks like that the EVENT_BEFORE_SEND_MAIL event is getting fired (which sends the email and generates the pdf), before that the EVENT_AFTER_COMPLETE_ORDER event is getting fired (that is creating the codes for the order

@engram-design
Copy link
Member

Hmmm, now that would be interesting if things happened in that order. I'm not quite sure how that'd be possible, as I would assume the order needs to be completed before the mail is sent out.

Still, that shouldn't be an issue. I'm wondering if you can confirm if there's no codes present in the lines above, by adding:

Craft::dd(Code::find()->orderId($order->id)->all());

Because at that point, it can't find any codes for the order, but it can when run later on-demand.

@WHITE-developer
Copy link

WHITE-developer commented Jul 21, 2023

We where sending the emails our self (not in a queue job) in a custom module in a EVENT_AFTER_COMPLETE_ORDER to check if a voucher has been ordered and a email/pdf should been sent.

So I guess our module is getting triggered before your Plugin. Although in Craft 3 it did go fine.
But if we moved it to a queue job it would probably also fix it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants