Exemplo n.º 1
0
    def revert_payment(self):
        from methods import alfa_bank, paypal

        assert self.used_cups == 0

        if self.payment_type_id == CARD_PAYMENT_TYPE:
            legal = self.payment_legal.get()
            alfa_bank.reverse(legal.alfa_login, legal.alfa_password,
                              self.payment_id)
        elif self.payment_type_id == PAYPAL_PAYMENT_TYPE:
            paypal.void(self.payment_id)
        self.close()
Exemplo n.º 2
0
    def cancel(self, namespace):
        from methods.alfa_bank import reverse

        if self.status == self.READY:
            legal = LegalInfo.query().get(
            )  # TODO find solution for multiple legals
            reverse(legal.alfa_login, legal.alfa_password, self.payment_id)
            share = Share.get_by_id(self.share_id)
            share.deactivate()
            promo_code = self.promo_code.get()
            promo_code.deactivate()
            self.status = self.CANCELED
            self.put()
            sender = Client.get(self.client_id)
            text = u'Ваш подарок не был получен. Ссылка более не будет активна, а деньги вернутся в ближайшее время.'
            header = u'Отмена подарка'
            SimplePush(text, False, text, header, sender, namespace).send()
Exemplo n.º 3
0
    def post(self):
        client_id = self.request.get("client_id") or int(
            self.request.headers.get('Client-Id', 0))
        binding_id = self.request.get("binding_id")
        amount = self.request.get_range("amount")

        legal = LegalInfo.query().get(
        )  # TODO find solution for multiple legals

        order_number = "dp_%s_%s" % (client_id, int(time.time()))
        success, result = alfa_bank.create_simple(legal.alfa_login,
                                                  legal.alfa_password, amount,
                                                  order_number, "_", client_id)
        if not success:
            self.response.set_status(400)
            self.render_json({"description": u"Ошибка перевода с карты"})
            return

        alfa_order_id = result
        success, error = alfa_bank.hold_and_check(legal.alfa_login,
                                                  legal.alfa_password,
                                                  alfa_order_id, binding_id)
        if not success:
            self.response.set_status(400)
            self.render_json({"description": u"Ошибка перевода с карты"})
            return

        wallet_source = "alfa:%s" % alfa_order_id
        try:
            wallet_result = empatika_wallet.deposit(client_id, amount * 100,
                                                    wallet_source)
        except empatika_wallet.EmpatikaWalletError as e:
            alfa_bank.reverse(legal.alfa_login, legal.alfa_password,
                              alfa_order_id)

            self.response.set_status(400)
            self.render_json({"description": e.message})
        else:
            alfa_bank.deposit(legal.alfa_login, legal.alfa_password,
                              alfa_order_id, 0)
            self.render_json({"balance": wallet_result["balance"] / 100.0})
Exemplo n.º 4
0
def _handle_auto(order):
    info = [
        ("id", order.key.id()),
        ("payment type", order.payment_type_id),
        ("payment id", order.payment_id)
    ]
    to_delete = False
    if order.has_card_payment:
        try:
            # check payment status
            legal = Venue.get_by_id(int(order.venue_id)).legal.get()
            status = alfa_bank.check_extended_status(legal.alfa_login, legal.alfa_password,
                                                     order.payment_id)["alfa_response"]
            info.append(("status check result", status))

            # if status check was successful:
            if str(status.get("errorCode", '0')) == '0':
                # money already deposited -- do not delete
                if status['orderStatus'] == 2:
                    info.append(("ERROR", "deposited"))
                # money approved -- reverse
                elif status['orderStatus'] == 1:
                    reverse_result = alfa_bank.reverse(legal.alfa_login, legal.alfa_password,
                                                       order.payment_id)
                    info.append(("reverse result", reverse_result))
                    if str(reverse_result.get('errorCode', '0')) == '0':
                        to_delete = True
                # any other status is OK to delete
                else:
                    to_delete = True
        except Exception as e:
            info.append(("exception", repr(e)))
    elif order.has_paypal_payment:
        try:
            # authorization exists (we have payment_id) and should be non-void
            void_success, void_error = paypal.void(order.payment_id)
            info.append(("void successful?", void_success))
            if void_success:
                to_delete = True
            else:
                info.append(("void error", void_error))
        except Exception as e:
            info.append(("exception", repr(e)))
    else:
        to_delete = True
    if to_delete:
        order.key.delete()
        info.append(("deleted", True))
    return info
Exemplo n.º 5
0
    def post(self):
        order_id = self.request.get('orderId') or self.request.get('order_id')

        alfa_response = alfa_bank.reverse(config.ALFA_LOGIN,
                                          config.ALFA_PASSWORD, order_id)
        self.render_json(alfa_response)
Exemplo n.º 6
0
def cancel_order(order, status, namespace, comment=None):
    success = True
    if order.has_card_payment:
        legal = Venue.get(order.venue_id).legal.get()
        return_result = alfa_bank.reverse(legal.alfa_login,
                                          legal.alfa_password,
                                          order.payment_id)
        success = str(return_result['errorCode']) == '0'
    elif order.has_paypal_payment:
        success, error = paypal.void(order.payment_id)
    if success:
        for gift_detail in order.gift_details:
            try:
                empatika_promos.cancel_activation(gift_detail.activation_id)
            except empatika_promos.EmpatikaPromosError as e:
                logging.exception(e)
                admins.send_error("payment", "Cancel activation", str(e))
                success = False
    if success:
        success_wallet_payment_reverse = False
        if order.wallet_payment > 0 and config.APP_KIND == AUTO_APP:
            try:
                empatika_wallet.reverse(order.client_id, order.key.id())
                deferred.defer(get_balance, order.client_id,
                               raise_error=True)  # just to update memcache
                success_wallet_payment_reverse = True
            except empatika_wallet.EmpatikaWalletError as e:
                logging.exception(e)
                admins.send_error("payment", "Wallet reversal failed", str(e))
                # main payment reversed -- do not abort
        for share_gift in order.shared_gift_details:
            gift = share_gift.gift.get()
            gift.recover()
        for performing in order.promo_code_performings:
            performing = performing.get()
            performing.recover()
        if order.subscription_details:
            subscription = order.subscription_details.subscription.get()
            subscription.recover(order.subscription_details.amount)
        if order.geo_push:
            geo_push = order.geo_push.get()
            geo_push.recover()
        if order.left_basket_promo:
            left_basket_promo = order.left_basket_promo.get()
            left_basket_promo.recover()

        order.status = status
        order.return_datetime = datetime.utcnow()
        order.return_comment = comment
        order.email_key_done = None
        order.email_key_cancel = None
        order.email_key_postpone = None
        order.email_key_confirm = None
        order.put()

        if order.shared_promo:
            shared_promo = order.shared_promo.get()

            if order.client_id == shared_promo.recipient.id():
                shared_promo.recipient_promo_success = False

            elif order.client_id == shared_promo.sender.id():
                shared_promo.sender_promo_success = False

            shared_promo.put()

        if status == CANCELED_BY_BARISTA_ORDER:
            client = Client.get(order.client_id)
            push_text = u"%s, заказ №%s отменен." % (client.name, order.number)
            if order.has_card_payment:
                push_text += u" Ваш платеж будет возвращен на карту в течение нескольких минут.\n"
            if success_wallet_payment_reverse:
                push_text += u" Бонусные баллы были возвращены на Ваш счет.\n"
            if comment:
                push_text += " " + comment
            OrderPush(push_text, order, namespace).send()
        elif status == CANCELED_BY_CLIENT_ORDER:
            message = u"Заказ из мобильного приложения №%s отменен клиентом" % order.key.id(
            )
            venue = Venue.get(order.venue_id)
            try:
                sms_pilot.send_sms(venue.phones, message)
            except:
                pass
            for email in venue.emails:
                if email:
                    deferred.defer(postmark.send_email, EMAIL_FROM, email,
                                   message, "<html></html>")
    return success