Problem/Motivation

Sending written statements of confirmation are important for both immediately validating oral declarations that lack recordings (guidance 3.10.1), and (potentially long after the declaration created) validating any declaration that lacks sufficient evidence (guidance 3.8.1). Although HMRC discusses these issues separately they are in fact exactly the same in their underlying logic.

Additionally:
A written confirmation is also an acceptable way of providing the required 'explanation' to a donor (guidance 3.6.2 says "explanation can be included on a Gift Aid declaration but can also be made separately").

B . Lastly, sites may wish to send confirmations in some or all cases even where they don't strictly need to, simply to minimise audit-related risk.

C. Sites may in some circumstances wish to resend confirmations, for example if they discover mistakes in the text of past confirmations, in cases of data entry error, or updated donor contact information.

Cancellation

The most obvious call to action in a written confirmation email is basically "click here to cancel this declaration" which HMRC expects to be retrospective cancellation if done within 30 days of the confirmation being sent. An edge case to consider here however is that when dealing with written confirmations done years after the declaration was made, the donor might wish instead to communicate something like "yeah, that declaration is fine when I made it 4 years ago, but actually I stopped being a taxpayer last year". This consideration has 2 consequences:

(A) We need to have 2 templates, one for immediate confirmation, one for long-after confirmation.
(B) We shouldn't assume at the API level that a cancellation within 30 days of confirmation being sent is a retrospective retraction of the declaration (even though our UI might default to that and we might not provide other options to donors).

Proposed resolution

Stage 1
a. Have a confirmation_date field on the declaration that marks the date the last written confirmation was sent.
b. Create a confirmation event that represents a wish to send a confirmation for a particular declaration. Subscribers should be able to stop the event being processed by further subscribers e.g. first one wins.
c. There should be 2 kinds of confirmation event, one for immediate confirmation and one for retrospective confirmation.
d. Have DeclarationForm dispatch the event post-save if the validity is NEEDS_CONFIRMATION and the confirmation_date field is blank.
e. Uncertain: do subscribers tell the even about the date confirmation sent and give the event the appropriate evidence entities they've created and leave it to the event caller to save these on the declaration, or do the subscribers save them on the declaration directly.

Stage 2
a. Create an email confirmation subscriber that sends a confirmation email, using a different template for the 2 kinds of confirmation.
b. The email templates should link to a cancellation form that retracts the declaration altogether
c. There shoud be an email evidence entity representing the confirmation and its text, to/from emails, date, etc.

Stage 3 (postponed)
Add an extra field 'send_confirmation' for declarations 'Send a written confirmation to the donor'.
The value of this (if enabled) is considered by DeclarationForm when deciding whether or not to send a confirmation.

Remaining tasks

User interface changes

API changes

Data model changes

Issue fork gift_aid-3537036

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

jonathanshaw created an issue. See original summary.

jonathanshaw’s picture

Subscribers need to be able to stop the event propagating to further subscribers, i.e. highest priority wins. This way for example, a DonorUserEmail subscriber can first try to send an email to the donor if the donor context is a user, but fall back to other ways of sending a written record if the donor isn't simply linked to a user or the user doesn't have an email.

jonathanshaw’s picture

Probably we can use twig templates as the defult text for the notifications. What Commerce does here with emails is likely a good pattern to copy.

adamps’s picture

This all makes sense, and I like it. I have some questions please.

(A) We need to have 2 templates, one for immediate confirmation, one for long-after confirmation.

c. There should be 2 kinds of confirmation event, one for immediate confirmation and one for retrospective confirmation.

I get your point and I see there are different cases. However I am concerned that we are creating dualism here and ignoring the middle way. In reality we will not get only "immediate" or "years ago" but also any point in between. So I am more inclined towards a single event and single template, with "time ago" as an available variable. We can put an if test on "time ago" in the default template to generate the same behaviour of 2 different wordings. However we get more flexibility: another site could easily alter the threshold of the if test or even split into 3 different wordings. We also get simplicity, and reduced development time.

adamps’s picture

Assigned: Unassigned » jonathanshaw

Probably we can use twig templates as the defult text for the notifications. What Commerce does here with emails is likely a good pattern to copy.

This area is something of a speciality for me😃 due to DSM+. Commerce is an OK pattern but it could be improved. They use templates, but put all the CSS in the template. They create their own framework for sending mails (and so does simplenews and likely so does XYZ etc). They can generate HTML emails, but only through the "legacy" Core interface which doesn't formally support HTML.

Some options:

  1. Symfony mailer in core is coming, but slowly - it's not even experimental yet. So that's no use.
  2. We could copy some of the ideas from Commerce's framework: a system of templates, some features for translations, a few other bits.
  3. We could use DSM+, which would be by far the fastest, simplest and most customisable way to do what we want. It has a much more powerful framework the Commerce, and use the symfony native HTML mail library directly. However currently DSM+ configures email transports entirely separately from Core which creates a problem for sites still on the Core transports. This option could work if DSM+ was enhanced to support fallback to the Core transports, which actually is likely reasonable easy because it already has most of the required conversion code. If you are open to this possibility then I could do some more investigation of the cost - it might be comparable to the previous option overall.

Please let me know how you feel about it...

adamps’s picture

Perhaps the required email text might vary for each of the 3 scenarios A,B,C in the IS. Indeed when you talk about immediate/retrospective, then this might actually be another aspect of the cause - immediate meaning caused by entry of a new declaration, and retrospective meaning any of the other cases.

We can add a variable to the template that indicates the cause/trigger of the confirmation. A single event and single template also seems to support this direction.

adamps’s picture

d. Have DeclarationForm dispatch the event post-save if the validity is NEEDS_CONFIRMATION and the confirmation_date field is blank.

The full decision whether to send a confirmation is likely to be complex, affected by these two factors and others

  1. validity === NEEDS_CONFIRMATION
  2. empty(confirmation_date)
  3. maybe also changed_date > confirmation_date which relates to parts of case C: data entry error
  4. maybe isNew() || has just changed a critical field else we keep sending an event endlessly even though an event subscriber is suppressing sending a confirmation (for example we don't have any contact details?) - but then maybe we need this event in case we do now have contact details
  5. input from the admin: likely we need a checkbox on the form "send confirmation", which we can default based on the above which allows case B and parts of C

Case A is likely covered anyway by the first bullet validity clause, because without an explanation it should be marked as needs confirmation.

jonathanshaw’s picture

Regarding mail transport and templating let's do whatever is cheapest. Probably DSM+. It's what I already use in my project, commerce depends on it, I've got no problem with requiring it as a dependency.

Styling is a non-issue with these emails really.

However I am concerned that we are creating dualism here and ignoring the middle way. In reality we will not get only "immediate" or "years ago" but also any point in between. So I am more inclined towards a single event and single template

Nice.

It seems like either we need a twig template with conditional logic, or we need a cluster of different email somethings. A single twig template is great unless it makes other things much more complex and there's a simpler more native DSM+ way.

We can add a variable to the template that indicates the cause/trigger of the confirmation.

Yes, we should. Although it might also be true that the current state of the declaration is more important, so we should pass the declaration into the template. I think probably we should build so that a confirmation is always specific to a single declaration; even if there's one day a UI option to reconfirm a donor, behind the scenes it should pick the best declaration and focus on that.

The full decision whether to send a confirmation is likely to be complex

Agreed. It's not fully fresh in my mind, but this is a key test of the APIs we've constructed before. Hopefully it should build on top of them nicely. Let's document the logic carefully anyway.

input from the admin: likely we need a checkbox on the form "send confirmation", which we can default based on the above which allows case B and parts of C

#3557144: Allow declaration types to specify field defaults discusses this a bit.
For now let's
(1) encapsulate the logic that decides whether that "send confirmation" box is checked or not by default
(2) invoke that logic directly post save, no UI.
(3) Split out a seperate issue for a "Send confirmation" UI.

There's tricky issues about how changes to a declaration impact its confirmed status that we should have confidence in our handling of before adding a UI to suppress confirmation sending. We might need a seperate issue to consider those anyway - maybe we've handled it, I can't quite remember.

maybe isNew() || has just changed a critical field else we keep sending an event endlessly even though an event subscriber is suppressing sending a confirmation (for example we don't have any contact details?) - but then maybe we need this event in case we do now have contact details

Sending repeated events sounds OK to me. If one of them actually sends a confirmation it fills in the confirmed_date, and after that no more events are sent. Even if each event triggers the queuing of a confirmation job, that's still ok, as long as the jobs check the confirmation_date when they run.

adamps’s picture

Assigned: jonathanshaw » adamps

Great thanks, that seems like enough of a plan for me to start coding. I suspect I will have more detailed questions later....

adamps’s picture

Issue summary: View changes
Status: Active » Needs work

It's now roughly working. I made quick progress: each of the task items corresponded to a neat isolated file or function; our design seems easy to work with.

I added some "Remaining tasks" to the IS for what I've not done yet.

I raised #3568837: Create a UI to allow staff to override whether to send a confirmation.

adamps’s picture

Issue summary: View changes
adamps’s picture

Code review changes done

jonathanshaw’s picture

The mail plugin should probably throw an error if the declaration is not date based, as the wording below doesn't handle this and we don't support it OOTB. Likewise the user mail subscriber should probably not pick up the event if the declaration is not date based.

We're going to need a self-cancellation form that's more elaborate than we currently have, but I think we can postpone that to a follow-on issue. It makes sense for the cancellation form to have information encouraging donors to contact support if they have questions etc, saying how helpful gift aid is, etc.

Also, once they've cancelled, we should probably show a message indicating whether the cancellation is effective retrospectively or not, which depends on the validity and confirmation status, etc. Even if the declaration requires confirmation, we can't always implement retrospective cancellation because the donor might return to the email and click the link years later.

Email text. I've done in twig-style, just for clarity here regardless of how we actually implement.
=========================

Subject: Thankyou for allowing us to claim Gift Aid

Dear {{ name }},

Thankyou for allowing us to claim Gift Aid on your donations. If you're a UK taxpayer the government will increase your donations by @gift_aid_rate% and it won't cost you a penny.

Our system has recorded that on {{ declaration date }} you told us to claim Gift Aid.
{% if startdate and enddate %}
This covers any donations you make from {{ start date }} until {{end date }} to {{ charity.fullName }}.
{% if start date and not enddate%}
This covers any donations you make from {{ start date }} onwards to {{ charity.fullName }}.
{% if enddate and not start date }}
This covers any donations you make from now until {{ end date }} to {{ charity.fullName }}.
{% else %}
This covers any donations you make from now on or have made in the past four years to {{ charity.fullName }}.
{%endif %}

Gift Aid is reclaimed by @charity_name from the tax you pay for the relevant tax year. If you pay less Income Tax and/or Capital Gains Tax than the amount of Gift Aid claimed on all your donations in that tax year then it is your responsibility to pay any difference. Please tell us if you no longer pay sufficient tax, or if your address changes.

We must have your current home address to claim Gift Aid on your donations. The address we have for you is:
{{ address }}
You can change your address here: {{ donor edit link }}

{% if recent %}
If you have changed your mind and do not wish us to claim Gift Aid, you can cancel Gift Aid here.
{% else %}
If your circumstances have changed and you do not wish us to claim Gift Aid on your donations, you can cancel Gift Aid here.
{% end if %}
{% if not valid without confirmation %}
If you cancel within 30 days of being sent this email, then it will be as if you'd never told us to claim Gift Aid.
{% else %}
{# sometimes it might not clear whether a declaration is valid or not, and it could be contested whether cancellation should be retrospective, but if invalid then a mention of the 30 days is required in HMRC confirmation guidelines for repairing invalid declarations, and we wouldn't want the confirmation to be deemed insufficient so we err on the safe-side by mentioning 30 days even if the declaration seems valid #}
If you wish to cancel, please do so within 30 days to have the greatest effect.
{% endif %}

If you have any questions about Gift Aid and your donations, please email us at {{ charity.email }}.

Thank you for your support,
{{ charity.name }}

adamps’s picture

Thanks #14 was very useful. I converted it to working code. If you try editing the policy you can see that it informs about the available variables in the "replacement patterns" section.

The generality of ConfirmationMailer to scenarios other than User account it somewhat tenuous. For the time being I kept it theoretically alive by adding two extra URL parameters.

The UserEmailConfirmation class only works properly with the 2 routes from the gift_aid_user module, so probably we should move it into that module. What do you say?

The self cancellation form still needs work: in particular it lacks any idea of retrospective cancellation.

adamps’s picture

Issue summary: View changes
adamps’s picture

I feel that the key here is simplicity. A confirmation is a very specific thing, which

  • describes Gift Aid status including dates and charity name
  • explains the "responsibility to pay any difference"
  • gives a right of retrospective cancellation for 30 days and explains this right
  • is tracked for audit purposes

sites may wish to send confirmations in some or all cases even where they don't strictly need to, simply to minimise audit-related risk.

The staff can simply set validity to "Valid if confirmed" for whatever cases they wish to send confirmations. We should follow the exact same logic as any mandatory confirmation, else our confirmation would not be valid.

Sites may in some circumstances wish to resend confirmations, for example if they discover mistakes in the text of past confirmations, in cases of data entry error, or updated donor contact information.

Likewise, I propose that the resend should follow identical logic. The first confirmation could easily be unacceptable, so we'd better ensure the second one is valid.

written confirmation is also an acceptable way of providing the required 'explanation' to a donor (guidance 3.6.2 says "explanation can be included on a Gift Aid declaration but can also be made separately").

This case is once again no different from the others. Surely once the Donor sees the explanation, they have a right to change their mind e.g. maybe they realise they don't pay enough tax.

(potentially long after the declaration created) validating any declaration that lacks sufficient evidence

Presumably this case still has to allow retrospective cancellation. The Donor may state they never intended to agree to Gift Aid, or that they weren't informed of the tax implications. From the perspective of this issue, it's identical logic once more. (From an admin perspective it may mean contacting HMRC to "un-claim" Gift Aid, but the "reporting" side of things is a future work item.)

===

We could imagine an "acknowledgement" - a communication sent describing Gift Aid status, but without any right to retrospective cancellation. AFAICS the Gift Aid rules don't ask for it, and care nothing about it - it would have no effect on validity, need not be tracked or evidenced, and could be worded however you like. I propose we treat that as out-of-scope of this issue.

So if you agree, it seems that we can remove the {% if not valid without confirmation %} and {% if recent %} tests from the email template, and instead show the same text to everyone.

jonathanshaw’s picture

The UserEmailConfirmation class only works properly with the 2 routes from the gift_aid_user module, so probably we should move it into that module. What do you say?

Definitely, good point.

We could imagine an "acknowledgement" - a communication sent describing Gift Aid status, but without any right to retrospective cancellation

I think there's a grey zone of uncertainty. Sites might end up at some point with declarations they have already claimed on, and don't want the hassle of refunding part of those claims to HMRC, but they're not certain the declarations would stand up to audit. Retrospective and/or not-required confirmation is to do with handling that grey zone. Retrospective cancellation would be a significant administrative headache, so sites are going to be very reluctant to do it, and we should avoid promising it to donors because I doubt sites will plan to honour it.

For oral confirmation HMRC require mention of retrospective:

an explanation of the donor’s entitlement to cancel the declaration retrospectively within 30 days

But for validation of invalid declarations they say only:

a statement giving the donor 30 days from the date of the written statement in which to cancel the Gift Aid declaration

So there's a slightly more room in the wording allowed to us, meaning that in the cases of non-recent or non-required confirmation-for-the-sake-of-precautionary-validation we can get away with being non-specific to the donor about how the cancellation would work. Which means that our confirmation is valid if at audit we needed to rely on it, without us needing to commit to the mightmare of retrospective cancellation for the sake of a confirmation we probably don't need.

Basically retrospective cancellation of declarations already used to make claims is such a nightmare that we shouldn't allow sites to promise it, let's not give them the footgun. Within that constraint they might still want to use confirmations.

Hypothetically: I have plenty of declarations I'm uncertain are auditproof but I don't want to promise and implement retrospective cancellation: I'd like to send legacy confirmations, implement prospective cancellation, and if I do get audited I hope that the confirmation protects me at least in the cases that didn't cancel within 30 days of it, leaving me with the (much much smaller) audit risk of only those who cancelled within 30 days and I didn't refund HMRC for. And I handle that risk by hoping that I don't get audited, and if I do, that the original declarations are found valid. Anything to avoid the hassle of refunding HMRC. It's this kind of scenario that the {%if%} are supporting.

So if you agree, it seems that we can remove the {% if not valid without confirmation %} and {% if recent %} tests from the email template, and instead show the same text to everyone.

The {recent} is basically a cosmetic matter of wording. The {valid without confirmation} is exploiting that discrepancy in the guidance about whether we have to promise retrospective or not.

I'm pretty happy with it as is. It seems like a useful feature to me.

adamps’s picture

But for validation of invalid declarations they say only:

Very interesting. But I'm not convinced😃. An alternative interpretation is that the wording difference is more accidental, not implying the significant difference you propose. My objection to your idea is that we would end up with a validation process which has no possibility of invalidation. In particular, let's say that (in 2026) the auditor insists that a declaration from 2024 isn't valid without a confirmation. If the donor responds (in 2026) with a cancellation, then I hardly see that the auditor will be impressed with your theory that the cancellation only affects future donations (2026 onwards), and that your claim from 2024 should stand.

Another consequence of your new theory is that it contradicts a fundamental premise of the IS:

Although HMRC discusses these issues separately they are in fact exactly the same in their underlying logic.

If we drop that premise, then it would vastly increase the complexity of this whole issue because we would need to distinguish the two different cases (confirmation and validation) throughout. It would mean that a statement email does not meet the conditions of a confirmation email. It would mean that DECLARATION_VALID_IF_CONFIRMED needs to be supplemented with DECLARATION_VALID_IF_STATEMENTED, isConfirmationMissing() is different from isStatementMissing(), and this would continue in very many places.

I suggest just using whether the declared date was within 30 days

The time-based dualism is trying to re-emerge😃. This seems much too simplistic. What if an oral declaration sat in a staff backlog for a month before data entry? Or if there was an oral declaration that was confirmed, then staff discovered it was sent to the wrong address and decided to resend? Or if a declaration that you are uncertain is bulletproof is also oral?

Perhaps we should have a call to discuss it??

adamps’s picture

FYI I have committed my changes from #17 for now so that I can continue to make progress.

I can reinstate something later if you do require it, but as above, I believe it would need to be much more complex than the previous code, which therefore is not useful to keep.

adamps’s picture

We shouldn't assume at the API level that a cancellation within 30 days of confirmation being sent is a retrospective retraction of the declaration

Good idea. On the cancellation form we can have two potential options: retrospective or future. Retrospective is only available if we have sent them a confirmation message within the last 30 days related to any one of their declarations. Future is only shown if the declaration is claimable (else there's no point in showing it, as the effect is the same as retrospective), which occurs after 7 days. If both options are available we show a 2-item select form element, each describing what will happen. Otherwise we can just show the text that would be on the one option as an ordinary paragraph.

here however is that when dealing with written confirmations done years after the declaration was made, the donor might wish instead to communicate something like "yeah, that declaration is fine when I made it 4 years ago, but actually I stopped being a taxpayer last year".

Yes, however it's not only "years after" though, any time above 7 days would be enough. And if they want the "last year" part they would need to contact a person as we only have the two options above.

adamps’s picture

Issue summary: View changes
adamps’s picture

I feel that #18 is an interesting idea, but is a non-standard process, which we can defer to another issue. I get the point, in effect you are being creative and have proposed a procedure to gather more evidence to support dubious paperwork. However let's call it something different from confirmation/validation/statement which have a formal precise meaning.

I propose that we consider confirmations/statements to be identical as per the IS. When we wish to formally validate a declaration as per the guidance (perhaps even on the authority of the auditor), then we should allow retrospective cancellation. If we don't, then we have

  • non-conformant data reporting: validations which have been (non-retrospectively) cancelled within 30 days are likely not acceptable, yet the reporting UI would mark the prior declaration as valid
  • a complicated implementation mess😃

How does that sound??

adamps’s picture

I raised #3570296: Improve self-cancellation UI.

In relation to that, one more thought regarding #18...

The starting point is a pile of declarations that are dubious. Likely most are correct, but some are wrong. Let's say there are 10000 claims including 100 who will cancel, of which 20 will do it retrospectively.

The goal I feel most attracted to is bringing clarity and accuracy; to be honest, and minimise audit risk. This suggests to increase the evidence for the correct declarations; to identify and withdraw the wrong ones. #3570296: Improve self-cancellation UI is very helpful in this case: it allows retroaction, but discourages it unless necessary. We have to withdraw 20. The audit is a piece of cake.

With the alternative strategy of "Anything to avoid the hassle of refunding HMRC", we end up with 100 cancellations (no option for retrospective), yet still claim for all 10000. In fact 20 of them are wrong, but we don't know which. It's possible that HMRC central computer will notice there is insufficient tax paid, and demand the money from the donor who then complains that he already cancelled. It's possible that the HMRC auditor will insist that we withdraw all 100 claims where the Donor cancelled. They might even be rather grumpy that we behaved in this way.

Maybe I'm too idealistic, it's not realistic to be so pure in the real world, and the auditors are sympathetic. In which case fine, we can have #18 as a separate issue. However I still believe it needs to be separate from confirmation/written statement. We could call it a notification. It could be applied (as an action?) to any declaration with validity "inherently valid". It grants no additional right to cancel beyond what someone already has. The process would make no change to any declaration field (in particular not confirmed date, confirmation required, validity that are altered by a true validation), other than to set some additional evidence.

adamps’s picture

Before I was resisting cron, as I felt it was complicated. Now I becoming attracted to it - true it takes a little code to set up, but once we have it we can eliminate various other difficulties.

  • We create a true database field for "status" or maybe better call it "state", which is therefore highly efficient for database queries. This would provide a simple accessor to replace the current getState() function, which is fairly complex and relies on many related isXXX(). Before we had a computed field, but there were concerns over caching (or over performance if we disable caching).
  • We could use state_machine module for this, which Commerce already requires.
  • We use cron to trigger the state transitions that are date based: stability window, confirmation window.
  • We could also potentially use cron to retry failed email sending.
  • Event handlers can register for transitions. For example a site could register for a declaration reaching its end date, and send a reminder email to the donor.

How do you feel about that??

adamps’s picture

FYI Guidance "3.8.1 Invalid declarations" says

Where the donor cancels their declaration within 30 days, the declaration will be treated as if it was never made. The charity must maintain an auditable record of all written statements and cancellation notices.

adamps’s picture

Assigned: adamps » jonathanshaw
Issue summary: View changes
Status: Needs work » Needs review

I've gone about as far as I can now until we can discuss some of the decisions

adamps’s picture

I feel that we could reasonably commit this issue as is or with minor comments, then continue the more complex cases in the other issues. This issue is now one of the biggest/most complex we've had.

jonathanshaw’s picture

Sorry for the delay in replying, I've been away.

#24

However I still believe it needs to be separate from confirmation/written statement. We could call it a notification. It could be applied (as an action?) to any declaration with validity "inherently valid". It grants no additional right to cancel beyond what someone already has. The process would make no change to any declaration field (in particular not confirmed date, confirmation required, validity that are altered by a true validation), other than to set some additional evidence.

(1)
(a) A point I haven't properly appreciated the significance of before was that if a declaration was retrospectively discovered to have been "valid if confirmed" not "inherently valid", but we wish to reply on a confirmation sent at the time of declaration with a "just in case" motivation, then that confirmation should technically have the explicit "30 days" text to meet the spec for a proper confirmation.
therefore
(b) all immediate confirmations (sent at point of declaration) should allow retrospective cancellation, and explicitly say so

(2)
(a) I'm certain we should never provide a way using the UI that could end up with retrospective cancellation of a declaration whose status was "inherently valid". That should be a hard impossibility, without custom code.
therefore
(b) retrospective confirmations (of non-recent declarations) should only allow retrospective cancellation (and therefore only mention 30 days explicitly) if the declaration is now "valid if confirmed" not if it is "inherently valid".

Effectively we have 4 scenarios, 2x2:
valid_if confirmed, inherently_valid
immediate_confirmation vs retrospective_validation

3 of these scenarios need exactly the same text and cancellation logic, and we can populate confirmed_date in the same way when sent. And I agree your email text shows we can get away without a "recent" conditional.

The odd man out is inherently_valid retrospective_validation. It shouldn't offer retrospective cancellation because the burden on sites may be too big; whether it's valid if it doesn't explicitly mention it is a point of debate above. Let's rule this scenario out of scope.

jonathanshaw’s picture

Assigned: jonathanshaw » adamps
Status: Needs review » Needs work

OK, so yes I think this is good now except for the MR comment I left about canRetroactivelyCancel() and DeclarationInterface::DECLARATION_VALID_IF_CONFIRMED, which relates to #29.1. Effectively as you suggested we are binding the whole idea of confirmation and retroactive cancellation tightly together, wherever there's confirmation there's retroactive cancellation, retrospective unnecessary confirmation being out of scope.

adamps’s picture

Thanks Jonathan. Good, I believe we are broadly in agreement, although I would tend to express it more simply.

I'm afraid that I still don't buy your distinction of "recent/immediate" vs "retrospective" confirmation.

  • I don't see how we can write code to express it, i.e. where will you draw the boundary line? Sure a confirmation email could often be truly immediate, within seconds. But maybe we had the wrong email address initially, and that is discovered after a week, or 2 or 3, or 23? And what about a posted paper confirmation? The staff might take a week to do it, or be on holiday for 2-3 weeks, or find it at the bottom of their tray 17 weeks later.
  • I see nothing in the guidelines that relates to it, or describes any difference in behaviour depending on time ago.

However I do agree with you about the distinct validity states, which we have created based on the HMRC guidelines.

  • "Inherently valid" means that it meets all the specified conditions. There is no need to offer retrospective cancellation, and we strongly desire not to. We could send a "notification" if we wish (without offering retrospective cancellation), but that won't help if the declaration is later corrected to "Valid if confirmed".
  • "Valid if confirmed" means that it unfortunately doesn't meet the conditions. There are multiple possible cases: it is an oral declaration; we didn't yet give the 'explanation'; we don't have adequate evidence; maybe others. The cases can come from 3.8.1 "written confirmation" or 3.10.1 "written record" however it makes little difference as the wording is almost identical. In all cases, we are invited to send a confirmation/statement that includes an offer of retrospective cancellation for 30 days. If the offer is not taken, then we can treat the declaration as valid. If we don't send a message, or we send one without offering retrospective, or there is a cancellation, the we must treat the declaration as invalid, as if never made.

So I am in agreement with your "3 scenarios exactly the same" - although I only see them as 1 scenario. And I am in agreement to rule the 4th scenario out of scope - although I don't see it as "a point of debate above", I see that the guidelines 100% clearly rule it out.

Anyway we are in clear agreement how to move forward, so that is excellent and we don't need to debate further.

adamps’s picture

Assigned: adamps » jonathanshaw
Status: Needs work » Needs review

All comments have been done. Merge is now blocked waiting for approval.

jonathanshaw’s picture

Assigned: jonathanshaw » adamps
Status: Needs review » Reviewed & tested by the community

Great, thx.

adamps’s picture

Thanks.

I believe I might have reached a new understanding of what you are saying in #29. If we could reword "recent/immediate" as "not yet claimed", and change "retrospective" to "already claimed" then it makes sense to me.

Then the 4 states, could we understand it like this: We will allow the staff to trigger an extra confirmation if either validity == "valid if confirmed" or !hasClaimed() (which covers 3 states). In the 4th state - which has a perfectly valid declaration that already has claims to HMRC - then we really don't want to mess with it, so we don't accept an extra confirmation (or perhaps only from admin). Anyway this all feeds into #3568837: Create a UI to allow staff to override whether to send a confirmation.

  • adamps committed bd0d5c24 on 1.x
    Feature: #3537036 Written confirmation
    
    By: jonathanshaw By: adamps
    
adamps’s picture

Status: Reviewed & tested by the community » Fixed

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.