def webhook_invoice_chargeback(iID, amount, date, mollie_payment_id, mollie_chargeback_id, note): """ Actuall add chargeback invoice payment This function is separate for testability """ from openstudio.os_invoice import Invoice invoice = Invoice(iID) print("note in wic") print(note) ipID = invoice.payment_add( amount, date, payment_methods_id=100, # Static id for Mollie payments mollie_payment_id=mollie_payment_id, mollie_chargeback_id=mollie_chargeback_id, note=note) # Notify customer of chargeback cuID = invoice.get_linked_customer_id() os_mail = OsMail() msgID = os_mail.render_email_template('payment_recurring_failed') os_mail.send_and_archive(msgID, cuID)
def webhook_invoice_chargeback(iID, chargeback_amount, chargeback_date, mollie_payment_id, chargeback_id, chargeback_details): """ Chargebacks happen when a direct debit payment fails due to insufficient funds in the customers' bank account :return: """ invoice = Invoice(iID) ipID = invoice.payment_add( chargeback_amount, chargeback_date, payment_methods_id=100, # Static id for Mollie payments mollie_payment_id=mollie_payment_id, note="Mollie Chargeback (%s) - %s" % (chargeback_id, chargeback_details)) # Notify customer of chargeback cuID = invoice.get_linked_customer_id() os_mail = OsMail() msgID = os_mail.render_email_template('payment_recurring_failed') os_mail.send(msgID, cuID)
def invoice_pay(): """ Link to mollie payment page from invoice payment """ from openstudio.os_customer import Customer #response.title = T("Pay invoice") iID = request.vars['iID'] invoice = Invoice(iID) invoice_amounts = invoice.get_amounts() if not invoice.get_linked_customer_id() == auth.user.id: return 'Not authorized' mollie = Mollie.API.Client() mollie_api_key = get_sys_property('mollie_website_profile') mollie.setApiKey(mollie_api_key) description = invoice.invoice.Description + ' - ' + invoice.invoice.InvoiceID recurring_type = None mollie_customer_id = None # Subscription invoice? if invoice.get_linked_customer_subscription_id(): # subscription invoice # customer = Customer(auth.user.id) # mollie_customer_id = customer.row.mollie_customer_id # check if we have a mollie customer id os_customer = Customer(auth.user.id) if os_customer.row.mollie_customer_id: # yep mollie_customer_id = os_customer.row.mollie_customer_id try: mollie_customer = mollie.customers.get(mollie_customer_id) # print "we've got one!" # print mollie_customer # print mollie.customers.all() except Exception as e: # print e.__class__.__name__ # print str(e) # print 'customer id invalid, create new customer' if 'The customer id is invalid' in str(e): create_mollie_customer(auth.user.id, mollie) os_customer = Customer(auth.user.id) # refresh else: create_mollie_customer(auth.user.id, mollie) os_customer = Customer(auth.user.id) # refresh mandates = os_customer.get_mollie_mandates() # set default recurring type, change to recurring if a valid mandate is found. recurring_type = 'first' if mandates['count'] > 0: # background payment valid_mandate = False for mandate in mandates: if mandate['status'] == 'valid': valid_mandate = True break if valid_mandate: # Do a normal payment, probably an automatic payment failed somewhere in the process # and customer should pay manually now recurring_type = None # Do a regular payment or first recurring payment try: webhook_url = 'https://' + request.env.http_host + '/mollie/webhook' payment = mollie.payments.create({ 'amount': invoice_amounts.TotalPriceVAT, 'description': description, 'recurringType': recurring_type, 'customerId': mollie_customer_id, 'redirectUrl': 'https://' + request.env.http_host + '/shop/complete?iID=' + unicode(iID), 'webhookUrl': webhook_url, 'metadata': { 'invoice_id': invoice.invoice.id, 'customers_orders_id': 'invoice' # This lets the webhook function know it's dealing with an invoice } }) db.invoices_mollie_payment_ids.insert( invoices_id=iID, mollie_payment_id=payment['id'], RecurringType=recurring_type, WebhookURL=webhook_url ) # Send the customer off to complete the payment. redirect(payment.getPaymentUrl()) except Mollie.API.Error as e: return 'API call failed: ' + e.message