f213/education-backend

View on GitHub
src/apps/amocrm/dto/transaction.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
from dataclasses import dataclass

from apps.amocrm.client import http
from apps.orders.models import Order


@dataclass
class AmoCRMTransactionDTO:
    order: Order

    def create(self) -> int:
        """
        Create transaction for given order
        https://www.amocrm.ru/support/customers/create_purchase
        """
        from apps.amocrm.ids import products_catalog_id

        response = http.post(
            url=f"/api/v4/customers/{self.order.user.amocrm_user.customer_id}/transactions",
            data=[
                {
                    "comment": f"Order slug in lms: {self.order.slug}",
                    "price": int(self.order.price),  # amocrm api requires field to be integer
                    "_embedded": {
                        "catalog_elements": [
                            {
                                "id": self.order.course.amocrm_course.amocrm_id,
                                "metadata": {
                                    "catalog_id": products_catalog_id(),
                                    "quantity": 1,  # only 1 course per order
                                },
                            },
                        ],
                    },
                },
            ],
        )

        return response["_embedded"]["transactions"][0]["id"]

    def delete(self) -> None:
        """
        Delete transaction for given order
        https://www.amocrm.ru/developers/content/crm_platform/customers-api#transactions-delete
        """
        http.delete(
            url=f"/api/v4/customers/transactions/{self.order.amocrm_transaction.amocrm_id}",  # type: ignore
            expected_status_codes=[204],
        )