Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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}