Skip to content

Commit

Permalink
CP-146 Avoid duplicate WP donations
Browse files Browse the repository at this point in the history
- Put donation processing inside job and try
to look for already existing donations before
processing.
  • Loading branch information
ecino committed Nov 29, 2022
1 parent 29ed01b commit 54c54f6
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 36 deletions.
5 changes: 5 additions & 0 deletions wordpress_connector/data/queue_job.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@
<field name="method">create_sponsorship_job</field>
<field name="channel_id" ref="channel_worpdress_connector"/>
</record>
<record id="create_donation_job" model="queue.job.function">
<field name="model_id" ref="model_account_invoice"/>
<field name="method">pay_wordpress_invoice</field>
<field name="channel_id" ref="channel_worpdress_connector"/>
</record>
</odoo>
96 changes: 60 additions & 36 deletions wordpress_connector/models/account_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class AccountInvoice(models.Model):
@api.model
def process_wp_confirmed_donation(self, donnation_infos):
"""
Utility to process the donation done via wordpress.
Utility to process the donation done via WordPress.
:return:
"""
for key in donnation_infos:
Expand Down Expand Up @@ -95,20 +95,20 @@ def create_from_wordpress(
"""
Utility for invoice donation creation.
:param partner_id: odoo partner_id
:param wp_origin: the fund code in wordpress
:param wp_origin: the fund code in WordPress
:param amount: amount of donation
:param fund: the fund code in wordpress
:param fund: the fund code in WordPress
:param child_code: child local_id
:param pf_payid: postfinance transaction number
:param payment_mode_name: the payment_mode identifier from postfinance
:param utm_source: the utm identifier in wordpress
:param utm_medium: the utm identifier in wordpress
:param utm_campaign: the utm identifier in wordpress
:param utm_source: the utm identifier in WordPress
:param utm_medium: the utm identifier in WordPress
:param utm_campaign: the utm identifier in WordPress
:param time: datetime of donation
:return: invoice_id
"""
_logger.info(
"New donation of CHF %s from Wordpress for partner %s and child %s",
"New donation of CHF %s from WordPress for partner %s and child %s",
amount,
partner_id,
child_code,
Expand All @@ -122,21 +122,6 @@ def create_from_wordpress(
else:
# We unarchive the partner to make it visible
partner.write({"active": True, "contact_id": False})
product = self.env["product.product"]
if fund:
product = product.search([("default_code", "ilike", fund)])
sponsorship = self.env["recurring.contract"]
if child_code:
sponsorship = sponsorship.search(
[
"|",
("partner_id", "=", partner_id),
("correspondent_id", "=", partner_id),
("child_code", "=", child_code),
],
order="id desc",
limit=1,
)
payment_mode = self.env["account.payment.mode"].search(
[("name", "=", payment_mode_name), ("active", "=", True)]
)
Expand All @@ -157,11 +142,17 @@ def create_from_wordpress(
}
)
origin = "WP " + wp_origin + " " + str(pf_payid)
utms = self.env["utm.mixin"].get_utms(utm_source, utm_medium, utm_campaign)
internet_id = self.env.ref("utm.utm_medium_website").id
payment_term_id = self.env.ref("account.account_payment_term_immediate").id
account = self.env["account.account"].search([("code", "=", "1050")])
date_invoice = fields.Datetime.from_string(time)
invoice = self.search([
("reference", "=", reference),
("partner_id", "=", partner_id)
], limit=1)
if invoice:
# Normally we should only have one invoice with a given PF_reference. In that case we return this
# invoice without doing anything, because probably another process is dealing with it.
return invoice.id
invoice = self.create(
{
"partner_id": partner_id,
Expand All @@ -176,6 +167,25 @@ def create_from_wordpress(
"payment_term_id": payment_term_id,
}
)
invoice.with_delay().pay_wordpress_invoice(
fund, child_code, wp_origin, amount, utm_source, utm_medium, utm_campaign)
return invoice.id

def pay_wordpress_invoice(self, fund, child_code, wp_origin, amount, utm_source, utm_medium, utm_campaign):
""" Create invoice lines and payment for a WordPress donation.
:param fund: the fund code in WordPress
:param child_code: the child reference (local_id)
:param wp_origin: the fund code in WordPress
:param amount: the donation amount
:param utm_source: tracking utm from WordPress
:param utm_medium: tracking utm from WordPress
:param utm_campaign: tracking utm from WordPress
:return: True
"""
self.ensure_one()
product = self.env["product.product"]
if fund:
product = product.search([("default_code", "ilike", fund)])
analytic_id = (
self.env["account.analytic.default"].account_get(product.id).analytic_id.id
)
Expand All @@ -184,9 +194,23 @@ def create_from_wordpress(
).analytic_tag_ids.ids
)
gift_account = self.env["account.account"].search([("code", "=", "6003")])
sponsorship = self.env["recurring.contract"]
if child_code:
sponsorship = sponsorship.search(
[
"|",
("partner_id", "=", partner_id),
("correspondent_id", "=", partner_id),
("child_code", "=", child_code),
],
order="id desc",
limit=1,
)
utms = self.env["utm.mixin"].get_utms(utm_source, utm_medium, utm_campaign)
internet_id = self.env.ref("utm.utm_medium_website").id
self.env["account.invoice.line"].create(
{
"invoice_id": invoice.id,
"invoice_id": self.id,
"product_id": product.id,
"account_id": product.property_account_income_id.id or gift_account.id,
"contract_id": sponsorship.id,
Expand All @@ -200,28 +224,28 @@ def create_from_wordpress(
"campaign_id": utms["campaign"],
}
)
partner.set_privacy_statement(origin="new_gift")
invoice.action_invoice_open()
self.partner_id.set_privacy_statement(origin="new_gift")
self.action_invoice_open()
payment_vals = {
"journal_id": self.env["account.journal"]
.search(
[("name", "=", "Web"), ("company_id", "=", partner.company_id.id)]
[("name", "=", "Web"), ("company_id", "=", self.partner_id.company_id.id)]
)
.id,
"payment_method_id": self.env["account.payment.method"]
.search([("code", "=", "sepa_direct_debit")])
.id,
"payment_date": invoice.date,
"communication": invoice.reference,
"invoice_ids": [(6, 0, invoice.ids)],
"payment_date": self.date,
"communication": self.reference,
"invoice_ids": [(6, 0, self.ids)],
"payment_type": "inbound",
"amount": invoice.amount_total,
"currency_id": invoice.currency_id.id,
"partner_id": invoice.partner_id.id,
"amount": self.amount_total,
"currency_id": self.currency_id.id,
"partner_id": self.partner_id.id,
"partner_type": "customer",
"payment_difference_handling": "reconcile",
"payment_difference": invoice.amount_total,
"payment_difference": self.amount_total,
}
account_payment = self.env["account.payment"].create(payment_vals)
account_payment.post()
return invoice.id
return True

0 comments on commit 54c54f6

Please sign in to comment.