def _order_requested(sender, order, **kwargs): # Check the status at PSP if status is still locked if order.status == StatusDefinition.LOCKED: order_payment = OrderPayment.get_latest_by_order(order) service = PaymentService(order_payment) service.check_payment_status()
def generate_donations_csv_file(path, loglevel): logger.setLevel(loglevel) error_count = 0 success_count = 0 filename = 'BLUE2SFDC_Donations.csv' with open(os.path.join(path, filename), 'wb') as csv_outfile: csvwriter = csv.writer(csv_outfile, quoting=csv.QUOTE_ALL) csvwriter.writerow(["Donation_External_ID__c", "Donor__c", "Project__c", "Amount", "CloseDate", "Name", "StageName", "Type", "Donation_created_date__c", "Donation_updated_date__c", "Donation_ready_date__c", "Payment_method__c", "RecordTypeId", "Fundraiser__c"]) donations = Donation.objects.all() logger.info("Exporting {0} Donation objects to {1}".format(donations.count(), filename)) t = 0 for donation in donations: t += 1 logger.debug("writing donation {0}/{1}: {2}".format(t, donations.count(), donation.id)) try: donor_id = '' if donation.user: donor_id = donation.user.id project_id = '' if donation.project: project_id = donation.project.id fundraiser_id = '' if donation.fundraiser: fundraiser_id = donation.fundraiser.id if donation.user and donation.user.get_full_name() != '': name = donation.user.get_full_name() else: name = "Anonymous" donation_ready = '' if donation.completed: donation_ready = donation.completed.strftime("%Y-%m-%dT%H:%M:%S.000Z") # Get the payment method from the associated order / payment payment_method = payment_method_mapping[''] # Maps to Unknown for DocData. if donation.order: lp = OrderPayment.get_latest_by_order(donation.order) if lp and lp.payment_method in payment_method_mapping: payment_method = payment_method_mapping[lp.payment_method] csvwriter.writerow([donation.id, donor_id, project_id, '%01.2f' % (float(donation.amount)), donation.created.date().strftime("%Y-%m-%dT%H:%M:%S.000Z"), name.encode("utf-8"), donation.order.get_status_display(), donation.order.order_type, donation.created.strftime("%Y-%m-%dT%H:%M:%S.000Z"), donation.updated.strftime("%Y-%m-%dT%H:%M:%S.000Z"), donation_ready, payment_method.encode("utf-8"), '012A0000000ZK6FIAW', fundraiser_id]) success_count += 1 except Exception as e: error_count += 1 logger.error("Error while saving donation id {0}: ".format(donation.id) + str(e)) return success_count, error_count
def _process_monthly_order(monthly_order, send_email=False): if monthly_order.processed: logger.info( "Order for {0} already processed".format(monthly_order.user)) return False ten_days_ago = timezone.now() + timezone.timedelta(days=-10) recent_orders = Order.objects.filter(user=monthly_order.user, order_type='recurring', updated__gt=ten_days_ago) if recent_orders.count() > 0: message = "Skipping '{0}' recently processed a recurring order for {1}:".format( monthly_order, monthly_order.user) logger.warn(message) for closed_order in recent_orders.all(): logger.warn("Recent Order Number: {0}".format(closed_order.id)) # Set an error on this monthly order monthly_order.error = message monthly_order.save() return False order = Order.objects.create(status=StatusDefinition.LOCKED, user=monthly_order.user, order_type='recurring') order.save() logger.info( "Creating Order for {0} with {1} donations".format(monthly_order.user, monthly_order.donations.count())) for monthly_donation in monthly_order.donations.all(): donation = Donation.objects.create(amount=monthly_donation.amount, project=monthly_donation.project, order=order) donation.save() integration_data = {'account_name': monthly_order.name, 'account_city': monthly_order.city, 'iban': monthly_order.iban, 'bic': monthly_order.bic, 'agree': True} order_payment = OrderPayment(order=order, user=monthly_order.user, payment_method=PAYMENT_METHOD, integration_data=integration_data) order_payment.save() try: service = PaymentService(order_payment) service.start_payment() except PaymentException as e: error_message = "Problem starting payment. {0}".format(e) monthly_order.error = "{0}".format(e.message) monthly_order.save() logger.error(error_message) order_payment.delete() order.delete() return False logger.debug("Payment for '{0}' started.".format(monthly_order)) monthly_order.processed = True monthly_order.error = '' monthly_order.save() # Try to update status service.check_payment_status() # Send an email to the user. if send_email: mail_monthly_donation_processed_notification(monthly_order) return True
def sync_donations(dry_run, sync_from_datetime, loglevel): logger.setLevel(loglevel) error_count = 0 success_count = 0 donations = Donation.objects.all() if sync_from_datetime: donations = donations.filter(updated__gte=sync_from_datetime) logger.info("Syncing {0} Donation objects.".format(donations.count())) for donation in donations: logger.debug("Syncing Donation: {0}".format(donation.id)) # Find the corresponding SF donation. try: sfdonation = SalesforceDonation.objects.get(external_id_donation=donation.id) except SalesforceDonation.DoesNotExist: sfdonation = SalesforceDonation() except Exception as e: logger.error("Error while loading sfdonation id {0} - stopping: ".format(donation.id) + str(e)) return success_count, error_count+1 # Poplate the data sfdonation.external_id_donation = donation.id sfdonation.amount = "%01.2f" % donation.amount if donation.user: try: sfdonation.donor = SalesforceContact.objects.get(external_id=donation.order.user.id) except SalesforceContact.DoesNotExist: logger.error("Unable to find contact id {0} in Salesforce for donation id {1}".format( donation.order.user.id, donation.id)) if donation.project: try: sfdonation.project = SalesforceProject.objects.get(external_id=donation.project.id) except SalesforceProject.DoesNotExist: logger.error("Unable to find project id {0} in Salesforce for donation id {1}".format( donation.project.id, donation.id)) if donation.fundraiser: try: sfdonation.fundraiser = SalesforceFundraiser.objects.get(external_id=donation.fundraiser.id) except SalesforceFundraiser.DoesNotExist: logger.error("Unable to find fundraiser id {0} in Salesforce for donation id {1}".format( donation.fundraiser.id, donation.id)) sfdonation.stage_name = donation.order.get_status_display() sfdonation.close_date = donation.created sfdonation.donation_created_date = donation.created sfdonation.donation_updated_date = donation.updated sfdonation.donation_ready_date = donation.completed or None sfdonation.type = donation.order.order_type if donation.user and donation.order.user.get_full_name() != '': sfdonation.name = donation.order.user.get_full_name() else: sfdonation.name = "Anonymous" sfdonation.record_type = "012A0000000ZK6FIAW" # Get the payment method from the associated order / payment sfdonation.payment_method = payment_method_mapping[''] # Maps to Unknown for DocData. if donation.order: lp = OrderPayment.get_latest_by_order(donation.order) if lp and lp.payment_method in payment_method_mapping: sfdonation.payment_method = payment_method_mapping[lp.payment_method] # Save the object to Salesforce if not dry_run: try: sfdonation.save() success_count += 1 except Exception as e: error_count += 1 logger.error("Error while saving donation id {0}: ".format(donation.id) + str(e)) return success_count, error_count
def _process_monthly_order(monthly_order, send_email=False): if monthly_order.processed: logger.info("Order for {0} already processed".format( monthly_order.user)) return {'order_payment_id': None, 'processed': True} order_success = [StatusDefinition.PENDING, StatusDefinition.SUCCESS] ten_days_ago = timezone.now() + timezone.timedelta(days=-10) recent_orders = Order.objects.filter(user=monthly_order.user, order_type='recurring', status__in=order_success, updated__gt=ten_days_ago) if recent_orders.count() > 0: message = "Skipping '{0}' recently processed a recurring order for {1}:".format( monthly_order, monthly_order.user) logger.warn(message) for closed_order in recent_orders.all(): logger.warn("Recent Order Number: {0}".format(closed_order.id)) # Set an error on this monthly order monthly_order.error = message monthly_order.save() return {'order_payment_id': None, 'processed': False} order = Order.objects.create(status=StatusDefinition.LOCKED, user=monthly_order.user, order_type='recurring') order.save() logger.info("Creating Order for {0} with {1} donations".format( monthly_order.user, monthly_order.donations.count())) for monthly_donation in monthly_order.donations.all(): donation = Donation.objects.create(amount=monthly_donation.amount, project=monthly_donation.project, order=order) donation.save() integration_data = { 'account_name': monthly_order.name, 'account_city': monthly_order.city, 'iban': monthly_order.iban, 'bic': monthly_order.bic, 'agree': True } order_payment = OrderPayment(order=order, user=monthly_order.user, payment_method=PAYMENT_METHOD, integration_data=integration_data) order_payment.save() try: service = PaymentService(order_payment) service.start_payment() except PaymentException as e: error_message = "Problem starting payment. {0}".format(e) monthly_order.error = "{0}".format(e.message) monthly_order.save() logger.error(error_message) return {'order_payment_id': order_payment.id, 'processed': False} logger.debug("Payment for '{0}' started.".format(monthly_order)) monthly_order.processed = True monthly_order.error = '' monthly_order.save() # Try to update status service.check_payment_status() # Send an email to the user. if send_email: mail_monthly_donation_processed_notification(monthly_order) return {'order_payment_id': order_payment.id, 'processed': True}