Пример #1
0
    def put(self, request, pk):
        """Elegir el plan requrido y desactivar los demas."""
        client_id = Operations.get_id(self, request)
        data = request.data
        plan = self.get_object(pk)
        try:
            plan_client = QueryPlansClient.objects.get(client=client_id, acquired_plan=plan.id)
            # import pdb; pdb.set_trace()
        except QueryPlansClient.DoesNotExist:
            raise Http404

        # valido el plan que se desea activar
        if (plan.is_active is True and plan_client.client_id == client_id and
                plan.expiration_date >= datetime.now().date()):

            # Activar Plan
            serializer = QueryPlansClientSerializer(plan_client, data, partial=True)
            if serializer.is_valid():
                serializer.save()
                if 'test' not in sys.argv:
                    # sincronizo en pyrebase
                    plan_chosen = get_query_set_plan()
                    plan_active = plan_chosen.filter(queryplansclient__client=client_id, is_active=True,
                                                             queryplansclient__is_chosen=True)
                    serializer_plan_acquired = QueryPlansAcquiredSerializer(plan_active[0])
                    pyrebase.chosen_plan(client_id, serializer_plan_acquired.data)
                    result_data = serializer_plan_acquired.data
                else:
                    result_data = {}
                return Response(result_data)
            else:
                return Response(serializer.errors, HTTP_400_BAD_REQUEST)
        raise Http404
Пример #2
0
    def put(self, request, code):
        """Activar producto, via codigo PIN."""
        data = request.data
        client = request.user.id
        has_chosen = False

        # activation_date = datetime.now().date()
        if self.get_some_chosen_plan(client):
            has_chosen = True
            is_chosen = False
        else:
            is_chosen = True

        plan_acquired = self.get_detail_plan(code, client)
        query_set = self.get_object(plan_acquired['id'])

        serializer = ActivePlanSerializer(query_set, data,
                                          context={
                                            'is_chosen': is_chosen,
                                            'client': client
                                            },
                                          partial=True)

        if serializer.is_valid():
            serializer.save()
            if not has_chosen:
                if 'test' not in sys.argv:
                    pyrebase.chosen_plan(client, serializer.data)
            return Response(serializer.data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Пример #3
0
    def create(self, validated_data):
        """Redefinido metodo create."""
        # Buscamos el especialista principal de la especialidad dada
        specialist = Specialist.objects.get(
            type_specialist="m", category_id=validated_data["category"])
        data_messages = validated_data.pop('message')
        # Buscamos el plan activo y elegido

        acq_plan = QueryPlansAcquired.objects.get(
            queryplansclient__is_chosen=True,
            queryplansclient__client=validated_data["client"])
        validated_data["specialist"] = specialist
        validated_data["status"] = 1
        validated_data["acquired_plan"] = acq_plan
        # Creamos la consulta y sus mensajes
        validated_data["available_requeries"] = acq_plan.available_requeries
        query = Query.objects.create(**validated_data)
        # creamos el grupo para ese mensaje
        group = GroupMessage.objects.create(status=1)
        # Generar codigo de usuario para chat
        code_user = generate_message_code_user(validated_data["client"],
                                               acq_plan)
        # Recorremos los mensajes para crearlos todos
        for data_message in data_messages:
            # por defecto el tipo de mensaje al crearse
            # debe de ser pregunta ('q')
            data_message["msg_type"] = "q"
            # data_message["specialist"] = specialist
            # armamos la sala para el usuario
            data_message["room"] = Params.PREFIX['client'] + str(
                validated_data["client"].id
            ) + '-' + Params.PREFIX['category'] + str(
                validated_data["category"].id)
            # data_message["code"] = validated_data["client"].code
            data_message["code"] = code_user
            # self.context["user_id"] = validated_data["client"].id
            Message.objects.create(query=query, group=group, **data_message)
        # restamos una consulta disponible al plan adquirido
        acq_plan.available_queries = acq_plan.available_queries - 1
        # si el plan queda en 0 consultas, pasa a culminado
        if acq_plan.available_queries == 0 and acq_plan.queries_to_pay == 0:
            acq_plan.status = 5
        acq_plan.save()
        if 'test' not in sys.argv:
            pyrebase.chosen_plan(
                validated_data["client"].id,
                {"available_queries": acq_plan.available_queries})
        return query
Пример #4
0
    def create(self, validated_data):
        """Metodo para guardar en venta."""
        products = validated_data.pop("products")
        total_amount = self.get_total_amount(products)
        validated_data["total_amount"] = total_amount
        instance = Sale(**validated_data)
        instance.save()
        sale_detail = {}
        client = validated_data["client"]
        max_fee_product = 0
        for product in products:
            plan_acquired = {}

            for prx in range(product["quantity"]):
                # verificamos si el producto es plan de consultass
                if product["product_type"].id == 1:
                    sale_detail["pin_code"] = generate_pin_code()
                    sale_detail["description"] = product["product_type"].description
                    sale_detail["price"] = float(product["plan_id"].price)
                    sale_detail["is_billable"] = product["is_billable"]
                    # comparo si es promocional o no
                    if product["is_billable"]:
                        sale_detail["discount"] = 0.0
                        plan_acquired["is_active"] = False
                        plan_acquired["available_queries"] = 0
                        plan_acquired["queries_to_pay"] = product["plan_id"].query_quantity
                        plan_acquired["status"] = 1
                        is_chosen = False
                    else:
                        # es plan promocional
                        plan_acquired["available_queries"] = product["plan_id"].query_quantity
                        plan_acquired["queries_to_pay"] = 0
                        validated_data["is_fee"] = False
                        plan_acquired["activation_date"] = date.today()
                        plan_acquired["status"] = date.today()
                        plan_acquired["expiration_date"] = get_date_by_time(product["plan_id"].validity_months)
                        # se activa automaticamente por ser promocional
                        plan_acquired["is_active"] = True
                        plan_acquired["status"] = 4
                        plan_promotionals = SellerNonBillablePlans.objects.get(
                            seller=validated_data["seller"],
                            number_month=hoy.month, number_year=hoy.year)
                        plan_promotionals.quantity = plan_promotionals.quantity - 1
                        plan_promotionals.save()
                        if not has_chosen_plan(validated_data["client"]):
                            is_chosen = True
                        else:
                            is_chosen = False
                        sale_detail["discount"] = float(product["plan_id"].price)
                    sale_detail["product_type"] = product["product_type"]
                    sale_detail["sale"] = instance
                    # creamos la instancia de detalle
                    instance_sale = SaleDetail.objects.create(**sale_detail)
                    # Calculamos la mayor cantidad de vigencias para el descuento
                    validity_months = product["plan_id"].validity_months
                    if validity_months > max_fee_product:
                        max_fee_product = validity_months

                    # llenamos data del plan adquirido

                    plan_acquired["validity_months"] = validity_months
                    plan_acquired["query_quantity"] = product["plan_id"].query_quantity
                    plan_acquired["available_requeries"] = 10  # harcoded. CAMBIAR
                    plan_acquired["maximum_response_time"] = 24  # harcoded.CAMBIAR
                    plan_acquired["plan_name"] = product["plan_id"].name
                    plan_acquired["query_plans"] = product["plan_id"]
                    plan_acquired["sale_detail"] = instance_sale
                    ins_plan = QueryPlansAcquired.objects.create(**plan_acquired)

                    QueryPlansClient.objects.create(
                        acquired_plan=ins_plan, status=1, is_chosen=is_chosen,
                        client=validated_data["client"])

                    if is_chosen:
                        if 'test' not in sys.argv:
                            ser = QueryPlansAcquiredSerializer(ins_plan)
                            new_ser = ser.data.copy()
                            new_ser["is_chosen"] = is_chosen
                            pyrebase.chosen_plan(client.id, new_ser)

        # Crear cuotas
        if validated_data["is_fee"]:
            n_fees = max_fee_product
        else:
            n_fees = 1
        # solo si no es promocional
        if product["is_billable"]:
            for i in range(1, n_fees+1):
                if n_fees == 1:
                    # Si la venta es de una sola cuota
                    fee_amount = float(instance.total_amount)
                else:
                    # Calcular el monto a pagar
                    fee_amount = 0
                    for product in products:
                        price = float(product["plan_id"].price)
                        validity_months = int(product["plan_id"].validity_months)
                        quantity = int(product["quantity"])

                        # Se Toman en cuenta solo planes con cuotas
                        if validity_months >= i:
                            fee_amount = (price/validity_months)*quantity + fee_amount

                pay_day = date.today() + relativedelta(months=i-1)  # Hardcoded cambiar la cantidad de dias
                sale_id = instance
                MonthlyFee.objects.create(fee_amount=fee_amount,
                                          fee_order_number=i, status=1,
                                          sale=sale_id,
                                          pay_before=pay_day,
                                          fee_quantity=n_fees)

        return instance
Пример #5
0
    def post(self, request):
        """Obtener la lista con todos los planes del cliente."""
        client = Operations.get_id(self, request)
        data = request.data

        if not 'acquired_plan' in data:
            raise serializers.ValidationError({'acquired_plan': [self.required]})

        if 'client' in data:
            clients = data['client']
            if type(clients) is str:
                clients = json.loads(clients)

            if type(clients) is not list:
                raise serializers.ValidationError({'client': [self.required]})

        try:
            acquired_plan = QueryPlansAcquired.objects.get(pk=data['acquired_plan'],
             queryplansclient__client=client, queryplansclient__share=True)
            acquired_plan_client = QueryPlansClient.objects.get(acquired_plan=acquired_plan,
             client=client)
        except QueryPlansAcquired.DoesNotExist:
            raise Http404

        try:
            client_obj = Client.objects.get(pk=client)
        except Client.DoesNotExist:
            raise Http404

        errors = {}
        serializer_data = {}

        # Validar cantidad total de consultas
        acumulator = 0
        for client_data in clients:
            if 'count' in client_data:
                acumulator += int(client_data['count'])

        if acumulator > acquired_plan.available_queries:
            raise serializers.ValidationError({'count': [self.to_much_query_share]})

        for client_data in clients:

            # Validamos si enviar el correo del cliente
            if 'email_receiver' in client_data:
                email_receiver = client_data['email_receiver']
            else:
                errors[email_receiver] = {'email_receiver': [self.required]}
                continue

            # Se valida que enviaron la cantidad
            if 'count' in client_data:
                count = int(client_data['count'])
            else:
                errors[email_receiver] = {'count': [self.required]}
                continue

            # Traer cliente by email si existe!
            try:
                receiver = Client.objects.get(email_exact=email_receiver)
                status_transfer = 1
                qset_client = Client.objects.filter(pk=receiver.id)
            except Client.DoesNotExist:
                status_transfer = 3
                receiver = None

            # No realizar operacion si tiene operacioens previas para este plan
            plan_manage = QueryPlansManage.objects.filter(
                Q(receiver=receiver, status=1) | Q(email_receiver=email_receiver, status=3)).filter(
                acquired_plan=acquired_plan.id, sender=client)
            if plan_manage and plan_manage[0].type_operation == 3:
                errors[email_receiver] = {'email_receiver': [self.already_exists_empower]}
                continue
            elif not plan_manage:
                plan_manage = None
            else:
                plan_manage = plan_manage[0]

            checker = CheckEmailOperationPlan(2, email_receiver, acquired_plan, client_obj, receiver)
            if not checker.is_valid():
                errors[email_receiver] = checker.errors
                continue

            data_manage = {
                'type_operation': 2,  # Compartir
                'status': status_transfer,
                'acquired_plan': acquired_plan.id,
                'new_acquired_plan': None,
                'sender': client,
                'receiver': receiver,
                'email_receiver': email_receiver,
                'count_queries': count
            }
            data_context = {}
            data_context['client_receiver'] = {
                'is_chosen': False,
                'owner': False,
                'transfer': False,
                'share': False,
                'empower': False,
                'status': status_transfer,
                'acquired_plan': None,
                'client': receiver
            }
            data_context['count'] = count
            data_context['acquired_plan'] = acquired_plan
            data_context['plan_manage'] = plan_manage

            serializer = QueryPlansShareSerializer(data=data_manage, context=data_context)

            if serializer.is_valid():
                serializer_data[email_receiver] = serializer
            else:
                errors[email_receiver] = serializer.errors

        # Se retornan los errores que se acumularon
        if errors:
            return Response(errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            # Para cada uno de los correos guardados
            for email_receiver in serializer_data:
                if 'test' not in sys.argv:
                    # Envio de correos notificacion
                    mail = BasicEmailAmazon(subject=str(self.subject), to=email_receiver,
                                template='email/share')
                    if receiver is not None:
                        arguments = {'message':self.default_message, 'link':WEB_HOST}
                    else:
                        arguments = {'message':REGISTRATION_MESSAGE, 'link':REGISTER_LINK}
                    mail.sendmail(args=arguments)

                # Ejecutamos el serializer
                serializer_data[email_receiver].save()

                if 'test' not in sys.argv:
                    if status_transfer == 1:
                        new_acquired = serializer_data[email_receiver].data["new_acquired_plan"]
                        reciever_id = serializer_data[email_receiver].data["receiver"]
                        dict_pending = NotificationClientSerializer(qset_client).data
                        badge_count = dict_pending["queries_pending"] + dict_pending["match_pending"]
                        data_notif_push = {
                            "title": "Se te han compartido consultas",
                            "body": display_client_name(client_obj),
                            "sub_text": "",
                            "ticker": "",
                            "badge": badge_count,
                            "icon": client_obj.photo,
                            "plan_id": new_acquired,
                            "type": Params.TYPE_NOTIF["plan"],
                            "queries_pending": dict_pending["queries_pending"],
                            "match_pending": dict_pending["match_pending"]
                        }
                        # envio de notificacion push
                        Notification.fcm_send_data(user_id=reciever_id,
                                                   data=data_notif_push)
                if acquired_plan_client.is_chosen:
                    data_plan = {
                        'available_queries': acquired_plan.available_queries
                    }
                    pyrebase.chosen_plan(client, data_plan)

            return Response({})
Пример #6
0
    def create(self, validated_data):
        """Metodo para confirmar pago."""
        fee = validated_data["monthly_fee"]
        # cambio el estatus de la cuota a pago
        # 2 PAID
        fee.status = 2
        fee.save()

        qsetdetail = SaleDetail.objects.filter(sale=fee.sale)
        # devolver plan name, validity_months, y query quantity de los productos adquiridos
        # mostrarlos en  la data
        data = {'qset': qsetdetail}
        # envio codigo pin por correo y aviso en push notification
        if fee.sale.status == 1:
            body = "Revisa tu correo, te enviamos tu codigo PIN"
            if qsetdetail.count() > 1:
                body = "Revisa tu correo, te enviamos tus codigos PIN"
            mail = BasicEmailAmazon(
                subject="Confirmación de pago. Productos comprados",
                to=fee.sale.client.username,
                template='email/pin_code')
            if 'test' not in sys.argv:
                mail.sendmail(args=data)
                qset_client = Client.objects.filter(pk=fee.sale.client_id)
                dict_pending = NotificationClientSerializer(qset_client).data
                badge_count = dict_pending["queries_pending"] + dict_pending[
                    "match_pending"]
                data_notif_push = {
                    "title": "Se ha validado tu pago",
                    "body": body,
                    "sub_text": "",
                    "ticker": "",
                    "badge": badge_count,
                    "icon":
                    'http://linkup-lb-09-916728193.us-east-1.elb.amazonaws.com/static/dashboard/dist/img/logo_grande.png',
                    "type": Params.TYPE_NOTIF["PIN"],
                    "queries_pending": dict_pending["queries_pending"],
                    "match_pending": dict_pending["match_pending"]
                }
                # envio de notificacion push
                Notification.fcm_send_data(user_id=fee.sale.client_id,
                                           data=data_notif_push)
        # buscar contacto efectivo para acualitzar estado a efectivo cliente
        # filtar por el correo del id del cliente
        SellerContact.objects.filter(
            email_exact=fee.sale.client.username).update(type_contact=3)
        # compruebo si no hay mas cuotas pendientes por pagar
        if MonthlyFee.objects.filter(sale=fee.sale, status=1).exists():
            # cambio el estatus de la ventas
            # 2 Progreso
            Sale.objects.filter(pk=fee.sale_id).update(status=2)
        else:
            # 3 pagada
            Sale.objects.filter(pk=fee.sale_id).update(status=3)

        for detail in qsetdetail:
            qacd = QueryPlansAcquired.objects.get(sale_detail=detail,
                                                  queryplansclient__owner=True)
            qpclient = qacd.queryplansclient_set.get()

            # debo chequear si es por cuotas o no
            if fee.sale.is_fee:
                new_queries = qacd.query_plans.query_quantity / qacd.query_plans.validity_months
                # libero el numero de consultas que corresponde
                qacd.available_queries += new_queries
                # actualizo cuantas consultas faltan por pagar
                qacd.queries_to_pay -= new_queries
            else:
                # libero el numero de consultas que corresponde
                qacd.available_queries = qacd.query_plans.query_quantity
                # actualizo cuantas consultas faltan por pagar
                qacd.queries_to_pay = 0
            if fee.sale.status == 1:
                qacd.status = 3
            qacd.save()
            # actualizo a pyrebase si es el elegido
            if 'test' not in sys.argv:
                if qpclient.is_chosen:
                    pyrebase.chosen_plan(
                        fee.sale.client.id,
                        {"available_queries": qacd.available_queries})
        # cambio el codigo del usuario
        user = User.objects.get(pk=fee.sale.client_id)
        if fee.sale.client.type_client == 'b':
            user.code = Params.CODE_PREFIX["client"] + user.ruc
        else:
            user.code = Params.CODE_PREFIX["client"] + user.document_number
        user.save()
        validated_data["status"] = 2
        instance = Payment(**validated_data)
        instance.save()
        return instance