{
  "openapi": "3.0.0",
  "info": {
    "title": "TrustAI Application",
    "version": "1.0.0",
    "description": "TrustAI reseller platform backend",
    "contact": {
      "name": "makano",
      "email": "makanobush@gmail.com"
    }
  },
  "paths": {
    "/admin/audit-log": {
      "get": {
        "x-controller-name": "AdminQueueController",
        "x-operation-name": "auditLog",
        "tags": [
          "AdminQueueController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Changes made by staff, newest first"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "before",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "entity",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "entityId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "actorId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "AdminQueueController.auditLog"
      }
    },
    "/admin/catalog/sync": {
      "post": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "sync",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Refresh every active provider catalog"
                }
              }
            }
          }
        },
        "operationId": "ServicesController.sync"
      }
    },
    "/admin/events": {
      "get": {
        "x-controller-name": "AdminEventsController",
        "x-operation-name": "events",
        "tags": [
          "AdminEventsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Recent admin activity from the in-memory ring"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "AdminEventsController.events"
      }
    },
    "/admin/metrics/funnel": {
      "get": {
        "x-controller-name": "OrderEventsController",
        "x-operation-name": "funnel",
        "tags": [
          "OrderEventsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Purchase funnel and failure reasons"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "OrderEventsController.funnel"
      }
    },
    "/admin/metrics/summary": {
      "get": {
        "x-controller-name": "MetricsController",
        "x-operation-name": "summary",
        "tags": [
          "MetricsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Admin dashboard metrics summary"
                }
              }
            }
          }
        },
        "operationId": "MetricsController.summary"
      }
    },
    "/admin/metrics/timeseries": {
      "get": {
        "x-controller-name": "MetricsController",
        "x-operation-name": "timeseries",
        "tags": [
          "MetricsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Per-day metrics for the last N days"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "MetricsController.timeseries"
      }
    },
    "/admin/notifications/read": {
      "post": {
        "x-controller-name": "AdminEventsController",
        "x-operation-name": "markRead",
        "tags": [
          "AdminEventsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Mark notifications as read"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": false
        },
        "operationId": "AdminEventsController.markRead"
      }
    },
    "/admin/notifications": {
      "get": {
        "x-controller-name": "AdminEventsController",
        "x-operation-name": "list",
        "tags": [
          "AdminEventsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Stored notifications, newest first, plus the unread count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "unreadOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "operationId": "AdminEventsController.list"
      },
      "delete": {
        "x-controller-name": "AdminEventsController",
        "x-operation-name": "clear",
        "tags": [
          "AdminEventsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Delete every stored notification"
                }
              }
            }
          }
        },
        "operationId": "AdminEventsController.clear"
      }
    },
    "/admin/order-bank-with-receipt": {
      "post": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "adminCreateBankOrderWithReceipt",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Admin creates bank order with receipt on behalf of customer",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data — customer userId, order fields + receipt file",
          "required": true
        },
        "operationId": "OrderDualPaymentController.adminCreateBankOrderWithReceipt"
      }
    },
    "/admin/orders/create": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "adminCreate",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Create (and optionally fulfil) an order for a customer"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "ResellerOrderController.adminCreate"
      }
    },
    "/admin/orders/manual-queue": {
      "get": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "manualQueue",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Orders for custom services awaiting manual fulfilment"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "ResellerOrderController.manualQueue"
      }
    },
    "/admin/orders/pending-verification": {
      "get": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "pendingVerification",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Orders whose payment receipt awaits admin verification"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "ResellerOrderController.pendingVerification"
      }
    },
    "/admin/orders/{id}/deliver": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "deliverManually",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deliver a manually fulfilled order to the buyer"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ResellerOrderController.deliverManually"
      }
    },
    "/admin/orders/{id}/provider-cancel": {
      "post": {
        "x-controller-name": "ProviderActionsController",
        "x-operation-name": "cancelAtProvider",
        "tags": [
          "ProviderActionsController"
        ],
        "responses": {
          "200": {
            "description": "Return value of ProviderActionsController.cancelAtProvider"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderActionsController.cancelAtProvider"
      }
    },
    "/admin/orders/{id}/provider-refill": {
      "post": {
        "x-controller-name": "ProviderActionsController",
        "x-operation-name": "createRefill",
        "tags": [
          "ProviderActionsController"
        ],
        "responses": {
          "200": {
            "description": "Return value of ProviderActionsController.createRefill"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderActionsController.createRefill"
      }
    },
    "/admin/orders/{id}/provider-refill-status": {
      "get": {
        "x-controller-name": "ProviderActionsController",
        "x-operation-name": "getRefillStatus",
        "tags": [
          "ProviderActionsController"
        ],
        "responses": {
          "200": {
            "description": "Return value of ProviderActionsController.getRefillStatus"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderActionsController.getRefillStatus"
      }
    },
    "/admin/orders/{id}/provider-status": {
      "get": {
        "x-controller-name": "ProviderActionsController",
        "x-operation-name": "getProviderStatus",
        "tags": [
          "ProviderActionsController"
        ],
        "responses": {
          "200": {
            "description": "Return value of ProviderActionsController.getProviderStatus"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderActionsController.getProviderStatus"
      }
    },
    "/admin/orders/{id}/reject-payment": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "rejectPayment",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Reject the receipt"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": false,
          "x-parameter-index": 1
        },
        "operationId": "ResellerOrderController.rejectPayment"
      }
    },
    "/admin/orders/{id}/retry-fulfillment": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "retryFulfillment",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Retry a failed supplier placement (same idempotency key)"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ResellerOrderController.retryFulfillment"
      }
    },
    "/admin/orders/{id}/verify-payment": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "verifyPayment",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Verify the receipt, confirm payment, and auto-fulfil"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ResellerOrderController.verifyPayment"
      }
    },
    "/admin/orders/{id}": {
      "get": {
        "x-controller-name": "AdminOrdersController",
        "x-operation-name": "findById",
        "tags": [
          "AdminOrdersController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Order detail with buyer and service"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "AdminOrdersController.findById"
      }
    },
    "/admin/orders": {
      "get": {
        "x-controller-name": "AdminOrdersController",
        "x-operation-name": "list",
        "tags": [
          "AdminOrdersController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Paginated admin order list"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "AdminOrdersController.list"
      }
    },
    "/admin/payment-references/{id}/check": {
      "post": {
        "x-controller-name": "PaymentReferencesController",
        "x-operation-name": "check",
        "tags": [
          "PaymentReferencesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Re-check a transaction ID against the official record"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "PaymentReferencesController.check"
      }
    },
    "/admin/payment-references": {
      "get": {
        "x-controller-name": "PaymentReferencesController",
        "x-operation-name": "list",
        "tags": [
          "PaymentReferencesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction IDs for the given orders / top-up receipts"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "orderIds",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "receiptIds",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "PaymentReferencesController.list"
      }
    },
    "/admin/pricing/settings": {
      "put": {
        "x-controller-name": "PricingController",
        "x-operation-name": "save",
        "tags": [
          "PricingController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Change the exchange rate (super admin)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "PricingController.save"
      },
      "get": {
        "x-controller-name": "PricingController",
        "x-operation-name": "settings",
        "tags": [
          "PricingController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "The exchange rate the pricing engine is using"
                }
              }
            }
          }
        },
        "operationId": "PricingController.settings"
      }
    },
    "/admin/providers/balances": {
      "get": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "balances",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Live balance for each active provider"
                }
              }
            }
          }
        },
        "operationId": "ProviderController.balances"
      }
    },
    "/admin/providers/{id}/catalog": {
      "get": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "providerCatalog",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "A provider’s bulk-synced source products"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "ServicesController.providerCatalog"
      }
    },
    "/admin/queue/settings": {
      "put": {
        "x-controller-name": "AdminQueueController",
        "x-operation-name": "saveSettings",
        "tags": [
          "AdminQueueController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Change the delivery promise and canned replies (super admin)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "AdminQueueController.saveSettings"
      },
      "get": {
        "x-controller-name": "AdminQueueController",
        "x-operation-name": "settings",
        "tags": [
          "AdminQueueController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Delivery promise and canned replies"
                }
              }
            }
          }
        },
        "operationId": "AdminQueueController.settings"
      }
    },
    "/admin/queue": {
      "get": {
        "x-controller-name": "AdminQueueController",
        "x-operation-name": "queue",
        "tags": [
          "AdminQueueController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Open orders, oldest first, with age and overdue flags"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "AdminQueueController.queue"
      }
    },
    "/admin/replacements/{id}/resolve": {
      "post": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "resolveReplacement",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Send a replacement, or decline with a reason"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "SubscriptionsController.resolveReplacement"
      }
    },
    "/admin/replacements": {
      "get": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "listReplacements",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Replacement requests, open first"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "SubscriptionsController.listReplacements"
      }
    },
    "/admin/services/curate": {
      "post": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "curate",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Create a curated service the bot will sell"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "ServicesController.curate"
      }
    },
    "/admin/services/custom/{id}": {
      "patch": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "updateCustom",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Update a custom (manually fulfilled) service"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ServicesController.updateCustom"
      }
    },
    "/admin/services/custom": {
      "post": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "createCustom",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Create a manually fulfilled service with no provider"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "ServicesController.createCustom"
      }
    },
    "/admin/services/images": {
      "post": {
        "x-controller-name": "ServiceImageController",
        "x-operation-name": "upload",
        "tags": [
          "ServiceImageController"
        ],
        "responses": {
          "200": {
            "description": "Uploaded image URL",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data with a single `image` file",
          "required": true
        },
        "operationId": "ServiceImageController.upload"
      }
    },
    "/admin/services/{id}/terms": {
      "patch": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "setTerms",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Set a product's duration and warranty (empty = clear)"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "SubscriptionsController.setTerms"
      },
      "get": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "terms",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "A product's duration and warranty"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "SubscriptionsController.terms"
      }
    },
    "/admin/services/{id}/waiting": {
      "get": {
        "x-controller-name": "PricingController",
        "x-operation-name": "waiting",
        "tags": [
          "PricingController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Customers waiting for this product to be back in stock"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "PricingController.waiting"
      }
    },
    "/admin/staff/{id}/active": {
      "post": {
        "x-controller-name": "StaffController",
        "x-operation-name": "setActive",
        "tags": [
          "StaffController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Enable or disable a staff account"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "StaffController.setActive"
      }
    },
    "/admin/staff/{id}/role": {
      "post": {
        "x-controller-name": "StaffController",
        "x-operation-name": "setRole",
        "tags": [
          "StaffController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Change a staff role"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "StaffController.setRole"
      }
    },
    "/admin/staff": {
      "post": {
        "x-controller-name": "StaffController",
        "x-operation-name": "create",
        "tags": [
          "StaffController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Create a staff account"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "StaffController.create"
      },
      "get": {
        "x-controller-name": "StaffController",
        "x-operation-name": "list",
        "tags": [
          "StaffController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Staff accounts and their roles"
                }
              }
            }
          }
        },
        "operationId": "StaffController.list"
      }
    },
    "/admin/subscriptions/settings": {
      "put": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "saveSettings",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Change when expiry reminders go out (super admin)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "SubscriptionsController.saveSettings"
      },
      "get": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "settings",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "When expiry reminders go out"
                }
              }
            }
          }
        },
        "operationId": "SubscriptionsController.settings"
      }
    },
    "/admin/topups/{id}/approve": {
      "post": {
        "x-controller-name": "WalletTopUpController",
        "x-operation-name": "approve",
        "tags": [
          "WalletTopUpController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Approve a top-up and credit the wallet"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": false,
          "x-parameter-index": 1
        },
        "operationId": "WalletTopUpController.approve"
      }
    },
    "/admin/topups/{id}/reject": {
      "post": {
        "x-controller-name": "WalletTopUpController",
        "x-operation-name": "reject",
        "tags": [
          "WalletTopUpController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Reject a top-up request"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": false,
          "x-parameter-index": 1
        },
        "operationId": "WalletTopUpController.reject"
      }
    },
    "/admin/topups": {
      "get": {
        "x-controller-name": "WalletTopUpController",
        "x-operation-name": "queue",
        "tags": [
          "WalletTopUpController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Wallet top-up requests awaiting review"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "WalletTopUpController.queue"
      }
    },
    "/banks/count": {
      "get": {
        "x-controller-name": "BankController",
        "x-operation-name": "count",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Bank model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Bank.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Bank>"
                }
              }
            }
          }
        ],
        "operationId": "BankController.count"
      }
    },
    "/banks/statuses": {
      "get": {
        "x-controller-name": "BankController",
        "x-operation-name": "getStatuses",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Available bank statuses",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "statuses": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "BankController.getStatuses"
      }
    },
    "/banks/{id}/logo": {
      "post": {
        "x-controller-name": "BankController",
        "x-operation-name": "uploadLogo",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    },
                    "logoPath": {
                      "type": "string"
                    }
                  }
                }
              }
            },
            "description": "Bank logo upload"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data value.",
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BankController.uploadLogo"
      },
      "get": {
        "x-controller-name": "BankController",
        "x-operation-name": "getLogo",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Get bank logo",
            "content": {
              "image/*": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "BankController.getLogo"
      }
    },
    "/banks/{id}": {
      "put": {
        "x-controller-name": "BankController",
        "x-operation-name": "replaceById",
        "tags": [
          "BankController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bank PUT success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bank"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "BankController.replaceById"
      },
      "patch": {
        "x-controller-name": "BankController",
        "x-operation-name": "updateById",
        "tags": [
          "BankController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bank PATCH success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BankPartial"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "BankController.updateById"
      },
      "get": {
        "x-controller-name": "BankController",
        "x-operation-name": "findById",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Bank model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bank.Filter"
                }
              }
            }
          }
        ],
        "operationId": "BankController.findById"
      },
      "delete": {
        "x-controller-name": "BankController",
        "x-operation-name": "deleteById",
        "tags": [
          "BankController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bank DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "BankController.deleteById"
      }
    },
    "/banks": {
      "post": {
        "x-controller-name": "BankController",
        "x-operation-name": "create",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Bank model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bank"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewBank"
              }
            }
          }
        },
        "operationId": "BankController.create"
      },
      "patch": {
        "x-controller-name": "BankController",
        "x-operation-name": "updateAll",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Bank PATCH success count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Bank.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Bank>"
                }
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BankPartial"
              }
            }
          }
        },
        "operationId": "BankController.updateAll"
      },
      "get": {
        "x-controller-name": "BankController",
        "x-operation-name": "find",
        "tags": [
          "BankController"
        ],
        "responses": {
          "200": {
            "description": "Array of Bank model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BankWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Bank.Filter1"
                }
              }
            }
          }
        ],
        "operationId": "BankController.find"
      }
    },
    "/bot/banks": {
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "banks",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Active bank/payment accounts for manual payment"
                }
              }
            }
          }
        },
        "operationId": "BotController.banks"
      }
    },
    "/bot/catalog": {
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "catalog",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Customer-facing catalog page"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "BotController.catalog"
      }
    },
    "/bot/events": {
      "post": {
        "x-controller-name": "OrderEventsController",
        "x-operation-name": "botEvent",
        "tags": [
          "OrderEventsController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Event recorded"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "OrderEventsController.botEvent"
      }
    },
    "/bot/language": {
      "post": {
        "x-controller-name": "BotController",
        "x-operation-name": "setLanguage",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Set the customer language"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "BotController.setLanguage"
      }
    },
    "/bot/me": {
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "me",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Customer profile, wallet balance, and order stats"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "telegramId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "BotController.me"
      }
    },
    "/bot/orders": {
      "post": {
        "x-controller-name": "BotController",
        "x-operation-name": "createOrder",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Create a pending order from the bot"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "BotController.createOrder"
      },
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "myOrders",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "A customer’s recent orders"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "telegramId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "BotController.myOrders"
      }
    },
    "/bot/receipt/{fileId}": {
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "receiptImage",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Stream a Telegram receipt image"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "fileId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "operationId": "BotController.receiptImage"
      }
    },
    "/bot/services/{id}": {
      "get": {
        "x-controller-name": "BotController",
        "x-operation-name": "service",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Customer-facing service detail"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "BotController.service"
      }
    },
    "/bot/start": {
      "post": {
        "x-controller-name": "BotController",
        "x-operation-name": "start",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Register/return the customer for a Telegram id"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "BotController.start"
      }
    },
    "/bot/test-cleanup": {
      "post": {
        "x-controller-name": "BotController",
        "x-operation-name": "testCleanup",
        "tags": [
          "BotController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Delete a bot test account (development only)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "BotController.testCleanup"
      }
    },
    "/customers/create": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "createCustomer",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Customer User Created",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "user": {
                      "$ref": "#/definitions/User"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstName",
                  "email",
                  "password"
                ],
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  },
                  "username": {
                    "type": "string"
                  },
                  "mobilePhone": {
                    "type": "string"
                  },
                  "telegramId": {
                    "type": "string"
                  },
                  "telegramUsername": {
                    "type": "string"
                  },
                  "initialBalance": {
                    "type": "number",
                    "minimum": 0
                  }
                }
              }
            }
          }
        },
        "operationId": "UserController.createCustomer"
      }
    },
    "/languages/bulk": {
      "post": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "createBulk",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Language model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Language"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/NewLanguage"
                }
              }
            }
          }
        },
        "operationId": "LanguageControllerController.createBulk"
      }
    },
    "/languages/count": {
      "get": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "count",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Language model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Language.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Language>"
                }
              }
            }
          }
        ],
        "operationId": "LanguageControllerController.count"
      }
    },
    "/languages/{id}": {
      "put": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "replaceById",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Language PUT success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Language"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "LanguageControllerController.replaceById"
      },
      "patch": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "updateById",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Language PATCH success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LanguagePartial"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "LanguageControllerController.updateById"
      },
      "get": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "findById",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Language model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Language.Filter"
                }
              }
            }
          }
        ],
        "operationId": "LanguageControllerController.findById"
      },
      "delete": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "deleteById",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Language DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "LanguageControllerController.deleteById"
      }
    },
    "/languages": {
      "post": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "create",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Language model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Language"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewLanguage"
              }
            }
          }
        },
        "operationId": "LanguageControllerController.create"
      },
      "patch": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "updateAll",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Language PATCH success count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Language.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Language>"
                }
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LanguagePartial"
              }
            }
          }
        },
        "operationId": "LanguageControllerController.updateAll"
      },
      "get": {
        "x-controller-name": "LanguageControllerController",
        "x-operation-name": "find",
        "tags": [
          "LanguageControllerController"
        ],
        "responses": {
          "200": {
            "description": "Array of Language model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LanguageWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Language.Filter1"
                }
              }
            }
          }
        ],
        "operationId": "LanguageControllerController.find"
      }
    },
    "/login": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "login",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Token",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "token": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "UserController.login"
      }
    },
    "/miniapp/banks": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "banks",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Payment accounts to transfer into"
                }
              }
            }
          }
        },
        "operationId": "MiniAppController.banks"
      }
    },
    "/miniapp/bootstrap": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "bootstrap",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Profile, wallet, stats, payment accounts and categories"
                }
              }
            }
          }
        },
        "operationId": "MiniAppController.bootstrap"
      }
    },
    "/miniapp/catalog": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "catalog",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Browse the curated catalog"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "MiniAppController.catalog"
      }
    },
    "/miniapp/events": {
      "post": {
        "x-controller-name": "OrderEventsController",
        "x-operation-name": "miniAppEvent",
        "tags": [
          "OrderEventsController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Event recorded"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "OrderEventsController.miniAppEvent"
      }
    },
    "/miniapp/language": {
      "post": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "setLanguage",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Set the customer language"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "MiniAppController.setLanguage"
      }
    },
    "/miniapp/orders/{id}": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "order",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "A single order belonging to the caller"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "MiniAppController.order"
      }
    },
    "/miniapp/orders": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "orders",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "The orders belonging to the caller"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "MiniAppController.orders"
      }
    },
    "/miniapp/services/{id}/notify-me": {
      "post": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "watchStockEndpoint",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Ask to be told when this product is back in stock"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "MiniAppController.watchStockEndpoint"
      },
      "delete": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "unwatchStockEndpoint",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Stop waiting for this product"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "MiniAppController.unwatchStockEndpoint"
      }
    },
    "/miniapp/services/{id}": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "service",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Product detail"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "MiniAppController.service"
      }
    },
    "/miniapp/subscriptions/{orderId}/report": {
      "post": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "report",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Ask for a replacement of a product under warranty"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "orderId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "SubscriptionsController.report"
      }
    },
    "/miniapp/subscriptions": {
      "get": {
        "x-controller-name": "SubscriptionsController",
        "x-operation-name": "mySubscriptions",
        "tags": [
          "SubscriptionsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "The customer's delivered products with expiry and warranty"
                }
              }
            }
          }
        },
        "operationId": "SubscriptionsController.mySubscriptions"
      }
    },
    "/miniapp/support/messages": {
      "post": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "sendSupportMessage",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Send a support message from the mini app"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "MiniAppController.sendSupportMessage"
      },
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "supportThread",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "The support thread of the caller"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "MiniAppController.supportThread"
      }
    },
    "/miniapp/wallet/topup": {
      "post": {
        "x-controller-name": "WalletTopUpController",
        "x-operation-name": "submitTopUp",
        "tags": [
          "WalletTopUpController"
        ],
        "responses": {
          "200": {
            "description": "Submit a wallet top-up for review"
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data — amount, bankId, reference (transaction ID), and the receipt image",
          "required": true
        },
        "operationId": "WalletTopUpController.submitTopUp"
      }
    },
    "/miniapp/wallet/topups": {
      "get": {
        "x-controller-name": "WalletTopUpController",
        "x-operation-name": "myTopUps",
        "tags": [
          "WalletTopUpController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Top-up requests belonging to the caller"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "WalletTopUpController.myTopUps"
      }
    },
    "/miniapp/wallet": {
      "get": {
        "x-controller-name": "MiniAppController",
        "x-operation-name": "wallet",
        "tags": [
          "MiniAppController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Wallet balance and the transactions of the caller"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "MiniAppController.wallet"
      }
    },
    "/order-bank-with-receipt": {
      "post": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "createBankOrderWithReceipt",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Create bank order with receipt atomically",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data — order fields + receipt file",
          "required": true
        },
        "operationId": "OrderDualPaymentController.createBankOrderWithReceipt"
      }
    },
    "/order-dual-payment/pending-payment-verification": {
      "get": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "getPendingPaymentOrders",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Get orders pending payment verification",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderWithRelations"
                  }
                }
              }
            }
          }
        },
        "operationId": "OrderDualPaymentController.getPendingPaymentOrders"
      }
    },
    "/order-dual-payment/{id}/approve-payment": {
      "patch": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "approvePaymentOrder",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Approve bank payment and send order to provider",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "reason": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "OrderDualPaymentController.approvePaymentOrder"
      }
    },
    "/order-dual-payment/{id}/reject-payment": {
      "patch": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "rejectPaymentOrder",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Reject bank payment",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "reason"
                ],
                "properties": {
                  "reason": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "OrderDualPaymentController.rejectPaymentOrder"
      }
    },
    "/order-dual-payment": {
      "post": {
        "x-controller-name": "OrderDualPaymentController",
        "x-operation-name": "createDualPaymentOrder",
        "tags": [
          "OrderDualPaymentController"
        ],
        "responses": {
          "200": {
            "description": "Create order with dual payment flow (Bank or Wallet)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderWithRelations"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "targetUrl",
                  "paymentMethod"
                ],
                "properties": {
                  "serviceId": {
                    "type": "number"
                  },
                  "targetUrl": {
                    "type": "string"
                  },
                  "quantity": {
                    "type": "number"
                  },
                  "paymentMethod": {
                    "type": "string",
                    "enum": [
                      "BANK",
                      "WALLET"
                    ]
                  },
                  "bankId": {
                    "type": "number"
                  },
                  "notes": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "OrderDualPaymentController.createDualPaymentOrder"
      }
    },
    "/orders/receipt-checkout": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "receiptCheckout",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "Create a pending order with a payment screenshot"
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data — serviceId, quantity, bankId, paymentReference and a receipt image",
          "required": true
        },
        "operationId": "ResellerOrderController.receiptCheckout"
      }
    },
    "/orders/wallet-checkout": {
      "post": {
        "x-controller-name": "ResellerOrderController",
        "x-operation-name": "walletCheckout",
        "tags": [
          "ResellerOrderController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Buy a digital product with wallet balance (auto-fulfilled)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "ResellerOrderController.walletCheckout"
      }
    },
    "/ping": {
      "get": {
        "x-controller-name": "PingController",
        "x-operation-name": "ping",
        "tags": [
          "PingController"
        ],
        "responses": {
          "200": {
            "description": "Ping Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PingResponse"
                }
              }
            }
          }
        },
        "operationId": "PingController.ping"
      }
    },
    "/provider-finance/balance/{providerId}": {
      "post": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "refreshBalance",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Live balance from provider API"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "providerId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderFinanceController.refreshBalance"
      },
      "get": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "getLatestBalance",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Latest balance snapshot"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "providerId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderFinanceController.getLatestBalance"
      }
    },
    "/provider-finance/cost-report": {
      "get": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "getCostReport",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Provider cost report"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "ProviderFinanceController.getCostReport"
      }
    },
    "/provider-finance/deposits/{id}": {
      "delete": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "deleteDeposit",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deleted"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderFinanceController.deleteDeposit"
      }
    },
    "/provider-finance/deposits": {
      "post": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "createDeposit",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deposit saved"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "ProviderFinanceController.createDeposit"
      },
      "get": {
        "x-controller-name": "ProviderFinanceController",
        "x-operation-name": "listDeposits",
        "tags": [
          "ProviderFinanceController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Deposit records"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "providerId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "ProviderFinanceController.listDeposits"
      }
    },
    "/providers/count": {
      "get": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "count",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "Provider model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Provider.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Provider>"
                }
              }
            }
          }
        ],
        "operationId": "ProviderController.count"
      }
    },
    "/providers/{id}": {
      "put": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "replaceById",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Provider PUT success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Provider"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ProviderController.replaceById"
      },
      "patch": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "updateById",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Provider PATCH success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderPartial"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ProviderController.updateById"
      },
      "get": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "findById",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "Provider model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Provider.Filter"
                }
              }
            }
          }
        ],
        "operationId": "ProviderController.findById"
      },
      "delete": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "deleteById",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Provider DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ProviderController.deleteById"
      }
    },
    "/providers": {
      "post": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "create",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "Provider model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Provider"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewProvider"
              }
            }
          }
        },
        "operationId": "ProviderController.create"
      },
      "patch": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "updateAll",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "Provider PATCH success count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Provider.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Provider>"
                }
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProviderPartial"
              }
            }
          }
        },
        "operationId": "ProviderController.updateAll"
      },
      "get": {
        "x-controller-name": "ProviderController",
        "x-operation-name": "find",
        "tags": [
          "ProviderController"
        ],
        "responses": {
          "200": {
            "description": "Array of Provider model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ProviderWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Provider.Filter1"
                }
              }
            }
          }
        ],
        "operationId": "ProviderController.find"
      }
    },
    "/receipts/count": {
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "count",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Receipt model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Receipt.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Receipt>"
                }
              }
            }
          }
        ],
        "operationId": "ReceiptController.count"
      }
    },
    "/receipts/pending": {
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "findPending",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Array of pending Receipt model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReceiptWithRelations"
                  }
                }
              }
            }
          }
        },
        "operationId": "ReceiptController.findPending"
      }
    },
    "/receipts/stats": {
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "getStats",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Receipt statistics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "total": {
                      "type": "number"
                    },
                    "pending": {
                      "type": "number"
                    },
                    "approved": {
                      "type": "number"
                    },
                    "rejected": {
                      "type": "number"
                    },
                    "underReview": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "ReceiptController.getStats"
      }
    },
    "/receipts/upload": {
      "post": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "uploadReceipt",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    },
                    "receiptId": {
                      "type": "number"
                    },
                    "screenshotPath": {
                      "type": "string"
                    }
                  }
                }
              }
            },
            "description": "Receipt with screenshot upload"
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "multipart/form-data value.",
          "required": true
        },
        "operationId": "ReceiptController.uploadReceipt"
      }
    },
    "/receipts/{id}/approve": {
      "patch": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "approveReceipt",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Receipt approval success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "processedByUserId": {
                    "type": "number"
                  },
                  "adminNotes": {
                    "type": "string"
                  }
                },
                "required": [
                  "processedByUserId"
                ]
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ReceiptController.approveReceipt"
      }
    },
    "/receipts/{id}/reject": {
      "patch": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "rejectReceipt",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Receipt rejection success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "processedByUserId": {
                    "type": "number"
                  },
                  "rejectionReason": {
                    "type": "string"
                  },
                  "adminNotes": {
                    "type": "string"
                  }
                },
                "required": [
                  "processedByUserId",
                  "rejectionReason"
                ]
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ReceiptController.rejectReceipt"
      }
    },
    "/receipts/{id}/screenshot": {
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "getScreenshot",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Get receipt screenshot",
            "content": {
              "image/*": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ReceiptController.getScreenshot"
      }
    },
    "/receipts/{id}": {
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "findById",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Receipt model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReceiptWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Receipt.Filter"
                }
              }
            }
          }
        ],
        "operationId": "ReceiptController.findById"
      },
      "delete": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "deleteById",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Receipt DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ReceiptController.deleteById"
      }
    },
    "/receipts": {
      "post": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "create",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Receipt model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Receipt"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewReceipt"
              }
            }
          }
        },
        "operationId": "ReceiptController.create"
      },
      "get": {
        "x-controller-name": "ReceiptController",
        "x-operation-name": "find",
        "tags": [
          "ReceiptController"
        ],
        "responses": {
          "200": {
            "description": "Array of Receipt model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ReceiptWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Receipt.Filter1"
                }
              }
            }
          }
        ],
        "operationId": "ReceiptController.find"
      }
    },
    "/seed": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "seed",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Seed data created"
                }
              }
            }
          }
        },
        "operationId": "UserController.seed"
      }
    },
    "/services/{id}/active": {
      "patch": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "setActive",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Turn a service on/off (controls bot visibility + sellability)"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ServicesController.setActive"
      }
    },
    "/services/{id}": {
      "get": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "findById",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Service detail"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ServicesController.findById"
      }
    },
    "/services": {
      "get": {
        "x-controller-name": "ServicesController",
        "x-operation-name": "list",
        "tags": [
          "ServicesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Paginated list of curated (sellable) services"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "ServicesController.list"
      }
    },
    "/staff/create": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "createStaff",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Staff User Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/definitions/User"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstName",
                  "email",
                  "password",
                  "permissions"
                ],
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  },
                  "username": {
                    "type": "string"
                  },
                  "mobilePhone": {
                    "type": "string"
                  },
                  "permissions": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "UserController.createStaff"
      }
    },
    "/support/bulk-auto-reply": {
      "post": {
        "x-controller-name": "SupportController",
        "x-operation-name": "bulkAutoReply",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Auto-reply sent to all unread conversations"
                }
              }
            }
          }
        },
        "operationId": "SupportController.bulkAutoReply"
      }
    },
    "/support/conversations/bulk-read-noise": {
      "post": {
        "x-controller-name": "SupportController",
        "x-operation-name": "bulkReadNoise",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Noise messages marked as read"
                }
              }
            }
          }
        },
        "operationId": "SupportController.bulkReadNoise"
      }
    },
    "/support/conversations/{telegramId}/read": {
      "patch": {
        "x-controller-name": "SupportController",
        "x-operation-name": "markRead",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Marked as read"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "telegramId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "operationId": "SupportController.markRead"
      }
    },
    "/support/conversations/{telegramId}": {
      "get": {
        "x-controller-name": "SupportController",
        "x-operation-name": "thread",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Full message thread"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "telegramId",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "operationId": "SupportController.thread"
      }
    },
    "/support/conversations": {
      "get": {
        "x-controller-name": "SupportController",
        "x-operation-name": "conversations",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "List of support conversations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "filter",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "SupportController.conversations"
      }
    },
    "/support/messages/inbound": {
      "post": {
        "x-controller-name": "SupportController",
        "x-operation-name": "inbound",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Message saved"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "SupportController.inbound"
      }
    },
    "/support/reply": {
      "post": {
        "x-controller-name": "SupportController",
        "x-operation-name": "reply",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Reply sent"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "SupportController.reply"
      }
    },
    "/support/unread-count": {
      "get": {
        "x-controller-name": "SupportController",
        "x-operation-name": "unreadCount",
        "tags": [
          "SupportController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Number of conversations with unread messages"
                }
              }
            }
          }
        },
        "operationId": "SupportController.unreadCount"
      }
    },
    "/telegram-auth": {
      "post": {
        "x-controller-name": "TelegramAuthController",
        "x-operation-name": "telegramAuth",
        "tags": [
          "TelegramAuthController"
        ],
        "responses": {
          "200": {
            "description": "Telegram authentication successful",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "token": {
                      "type": "string"
                    },
                    "userProfile": {
                      "type": "object"
                    },
                    "wallet": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "initData"
                ],
                "properties": {
                  "initData": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "TelegramAuthController.telegramAuth"
      }
    },
    "/telegram-user-info": {
      "post": {
        "x-controller-name": "TelegramAuthController",
        "x-operation-name": "telegramUserInfo",
        "tags": [
          "TelegramAuthController"
        ],
        "responses": {
          "200": {
            "description": "Get user info by Telegram ID",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "telegramId"
                ],
                "properties": {
                  "telegramId": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "TelegramAuthController.telegramUserInfo"
      }
    },
    "/transactions/count": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "count",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Transaction model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Transaction.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Transaction>"
                }
              }
            }
          }
        ],
        "operationId": "TransactionController.count"
      }
    },
    "/transactions/deposit-request": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "requestDeposit",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Deposit request created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount",
                  "bankId",
                  "reference"
                ],
                "properties": {
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "bankId": {
                    "type": "number"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.requestDeposit"
      }
    },
    "/transactions/my-transactions": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getMyTransactions",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Current user transaction history with pagination",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionWithRelations"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "totalCount": {
                          "type": "number"
                        },
                        "limit": {
                          "type": "number"
                        },
                        "offset": {
                          "type": "number"
                        },
                        "page": {
                          "type": "number"
                        },
                        "totalPages": {
                          "type": "number"
                        },
                        "hasMore": {
                          "type": "boolean"
                        }
                      }
                    },
                    "filters": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "dateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "TransactionController.getMyTransactions"
      }
    },
    "/transactions/payment-methods": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getPaymentMethods",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Get all payment methods",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.getPaymentMethods"
      }
    },
    "/transactions/pending-deposits": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getPendingDeposits",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Pending deposit transactions",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TransactionWithRelations"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.getPendingDeposits"
      }
    },
    "/transactions/purchase": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "createPurchase",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Create purchase transaction",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userId",
                  "amount",
                  "description"
                ],
                "properties": {
                  "userId": {
                    "type": "number"
                  },
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "description": {
                    "type": "string"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.createPurchase"
      }
    },
    "/transactions/refund": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "createRefund",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Create refund transaction",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userId",
                  "amount",
                  "description"
                ],
                "properties": {
                  "userId": {
                    "type": "number"
                  },
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "description": {
                    "type": "string"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "originalTransactionId": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.createRefund"
      }
    },
    "/transactions/statistics": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getTransactionStatistics",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Transaction statistics",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "totalTransactions": {
                      "type": "number"
                    },
                    "totalAmount": {
                      "type": "number"
                    },
                    "totalDeposits": {
                      "type": "number"
                    },
                    "totalWithdrawals": {
                      "type": "number"
                    },
                    "totalTransfers": {
                      "type": "number"
                    },
                    "totalRefunds": {
                      "type": "number"
                    },
                    "byStatus": {
                      "type": "object"
                    },
                    "byType": {
                      "type": "object"
                    },
                    "byPaymentMethod": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "startDate",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "endDate",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "TransactionController.getTransactionStatistics"
      }
    },
    "/transactions/statuses": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getTransactionStatuses",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Get all transaction statuses",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.getTransactionStatuses"
      }
    },
    "/transactions/transfer": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "createTransfer",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Create transfer transaction",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "senderTransaction": {
                      "$ref": "#/components/schemas/Transaction"
                    },
                    "receiverTransaction": {
                      "$ref": "#/components/schemas/Transaction"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "senderId",
                  "recipientId",
                  "amount"
                ],
                "properties": {
                  "senderId": {
                    "type": "number"
                  },
                  "recipientId": {
                    "type": "number"
                  },
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "description": {
                    "type": "string"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.createTransfer"
      }
    },
    "/transactions/types": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getTransactionTypes",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Get all transaction types",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "TransactionController.getTransactionTypes"
      }
    },
    "/transactions/user/{userId}": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "getUserTransactions",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "User transaction history with pagination",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionWithRelations"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "totalCount": {
                          "type": "number"
                        },
                        "limit": {
                          "type": "number"
                        },
                        "offset": {
                          "type": "number"
                        },
                        "page": {
                          "type": "number"
                        },
                        "totalPages": {
                          "type": "number"
                        },
                        "hasMore": {
                          "type": "boolean"
                        }
                      }
                    },
                    "filters": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "dateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "TransactionController.getUserTransactions"
      }
    },
    "/transactions/{id}/approve": {
      "patch": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "approveDeposit",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction approved"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "TransactionController.approveDeposit"
      }
    },
    "/transactions/{customerId}/deposit": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "createDepositForCustomer",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Create deposit transaction for customer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount",
                  "paymentMethod"
                ],
                "properties": {
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "paymentMethod": {
                    "type": "string",
                    "enum": [
                      "MANUAL_BANK",
                      "CHAPA_GATEWAY",
                      "WALLET_TRANSFER",
                      "CASH",
                      "ADMIN_ADJUSTMENT"
                    ]
                  },
                  "description": {
                    "type": "string"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TransactionController.createDepositForCustomer"
      }
    },
    "/transactions/{id}/reject": {
      "patch": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "rejectDeposit",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction rejected"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "reason": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TransactionController.rejectDeposit"
      }
    },
    "/transactions/{id}/status": {
      "patch": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "updateTransactionStatus",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction status updated"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "PENDING",
                      "COMPLETED",
                      "FAILED",
                      "CANCELLED",
                      "REJECTED"
                    ]
                  },
                  "reason": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TransactionController.updateTransactionStatus"
      }
    },
    "/transactions/{customerId}/withdraw": {
      "post": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "createWithdrawalForCustomer",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Create withdrawal transaction for customer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount",
                  "paymentMethod"
                ],
                "properties": {
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  },
                  "paymentMethod": {
                    "type": "string",
                    "enum": [
                      "MANUAL_BANK",
                      "CHAPA_GATEWAY",
                      "WALLET_TRANSFER",
                      "CASH",
                      "ADMIN_ADJUSTMENT"
                    ]
                  },
                  "description": {
                    "type": "string"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "recipientInfo": {
                    "type": "string"
                  },
                  "metadata": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TransactionController.createWithdrawalForCustomer"
      }
    },
    "/transactions/{id}": {
      "patch": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "updateById",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction PATCH success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionPartial"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TransactionController.updateById"
      },
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "findById",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Transaction model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Transaction.Filter"
                }
              }
            }
          }
        ],
        "operationId": "TransactionController.findById"
      },
      "delete": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "deleteById",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Transaction DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "TransactionController.deleteById"
      }
    },
    "/transactions": {
      "get": {
        "x-controller-name": "TransactionController",
        "x-operation-name": "find",
        "tags": [
          "TransactionController"
        ],
        "responses": {
          "200": {
            "description": "Array of Transaction model instances with pagination",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionWithRelations"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "totalCount": {
                          "type": "number"
                        },
                        "limit": {
                          "type": "number"
                        },
                        "offset": {
                          "type": "number"
                        },
                        "page": {
                          "type": "number"
                        },
                        "totalPages": {
                          "type": "number"
                        },
                        "hasMore": {
                          "type": "boolean"
                        }
                      }
                    },
                    "filters": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "paymentMethod",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "recipientUserId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxAmount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "amount",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "customerName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dateRange",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "TransactionController.find"
      }
    },
    "/users/check-duplicate": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "checkDuplicate",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Check for duplicate users"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "operationId": "UserController.checkDuplicate"
      }
    },
    "/users/customers/telegram-ids": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "getTelegramIds",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get total customer count and their telegram IDs with pagination",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "totalCount": {
                      "type": "number"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "telegramId": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "limit": {
                          "type": "number"
                        },
                        "offset": {
                          "type": "number"
                        },
                        "hasMore": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "UserController.getTelegramIds"
      }
    },
    "/users/customers/{id}/wallet": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "getCustomerWallet",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get customer wallet information",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/definitions/Wallet"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UserController.getCustomerWallet"
      }
    },
    "/users/customers/{id}": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "getCustomerById",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get customer by ID with wallet information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UserController.getCustomerById"
      }
    },
    "/users/customers": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "findCustomers",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get all customers with their wallet information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "number"
                      },
                      "telegramId": {
                        "type": "string"
                      },
                      "telegramUsername": {
                        "type": "string"
                      },
                      "email": {
                        "type": "string"
                      },
                      "firstName": {
                        "type": "string"
                      },
                      "lastName": {
                        "type": "string"
                      },
                      "username": {
                        "type": "string"
                      },
                      "mobilePhone": {
                        "type": "string"
                      },
                      "permissions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "userType": {
                        "type": "string"
                      },
                      "isActive": {
                        "type": "boolean"
                      },
                      "createdAt": {
                        "type": "string"
                      },
                      "updatedAt": {
                        "type": "string"
                      },
                      "wallet": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "number"
                          },
                          "userId": {
                            "type": "number"
                          },
                          "balanceBirr": {
                            "type": "number"
                          },
                          "createdAt": {
                            "type": "string"
                          },
                          "updatedAt": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "UserController.findCustomers"
      }
    },
    "/users/customers-with-wallets": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "findCustomersWithWallets",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get all customers with their wallet information (with pagination and filters)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "totalCount": {
                          "type": "number"
                        },
                        "limit": {
                          "type": "number"
                        },
                        "offset": {
                          "type": "number"
                        },
                        "page": {
                          "type": "number"
                        },
                        "totalPages": {
                          "type": "number"
                        },
                        "hasMore": {
                          "type": "boolean"
                        }
                      }
                    },
                    "filters": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "isActive",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "hasWallet",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "minBalance",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxBalance",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortOrder",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "operationId": "UserController.findCustomersWithWallets"
      }
    },
    "/users/me": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "me",
        "tags": [
          "UserController"
        ],
        "security": [
          {
            "jwt": []
          }
        ],
        "responses": {
          "200": {
            "description": "The current user profile",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/definitions/User"
                }
              }
            }
          }
        },
        "operationId": "UserController.me"
      }
    },
    "/users/staff": {
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "findStaff",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Get all staff members",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/User"
                  }
                }
              }
            }
          }
        },
        "operationId": "UserController.findStaff"
      }
    },
    "/users/{id}": {
      "patch": {
        "x-controller-name": "UserController",
        "x-operation-name": "updateUser",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "User updated successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/definitions/User"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "username": {
                    "type": "string"
                  },
                  "mobilePhone": {
                    "type": "string"
                  },
                  "permissions": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "isActive": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "UserController.updateUser"
      },
      "get": {
        "x-controller-name": "UserController",
        "x-operation-name": "getUserById",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "User by ID",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/definitions/User"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UserController.getUserById"
      },
      "delete": {
        "x-controller-name": "UserController",
        "x-operation-name": "deleteUser",
        "tags": [
          "UserController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "User deleted successfully"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UserController.deleteUser"
      }
    },
    "/wallets/count": {
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "count",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Wallet model count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Wallet.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Wallet>"
                }
              }
            }
          }
        ],
        "operationId": "WalletController.count"
      }
    },
    "/wallets/create-for-user": {
      "post": {
        "x-controller-name": "WalletController",
        "x-operation-name": "createWalletForUser",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Create wallet for existing user",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "userId"
                ],
                "properties": {
                  "userId": {
                    "type": "number"
                  },
                  "initialBalance": {
                    "type": "number",
                    "default": 0
                  }
                }
              }
            }
          }
        },
        "operationId": "WalletController.createWalletForUser"
      }
    },
    "/wallets/my-wallet": {
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "getMyWallet",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Current user wallet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletWithRelations"
                }
              }
            }
          }
        },
        "operationId": "WalletController.getMyWallet"
      }
    },
    "/wallets/user/{userId}": {
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "getWalletByUserId",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Get wallet by user ID",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "WalletController.getWalletByUserId"
      }
    },
    "/wallets/with-users": {
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "findWalletsWithUsers",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Array of Wallet model instances with user information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WalletWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet.Filter"
                }
              }
            }
          }
        ],
        "operationId": "WalletController.findWalletsWithUsers"
      }
    },
    "/wallets/{id}/add-balance": {
      "patch": {
        "x-controller-name": "WalletController",
        "x-operation-name": "addBalance",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Add balance to wallet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount"
                ],
                "properties": {
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "WalletController.addBalance"
      }
    },
    "/wallets/{id}/deduct-balance": {
      "patch": {
        "x-controller-name": "WalletController",
        "x-operation-name": "deductBalance",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Deduct balance from wallet",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount"
                ],
                "properties": {
                  "amount": {
                    "type": "number",
                    "minimum": 0.01
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "WalletController.deductBalance"
      }
    },
    "/wallets/{id}": {
      "put": {
        "x-controller-name": "WalletController",
        "x-operation-name": "replaceById",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Wallet PUT success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Wallet"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "WalletController.replaceById"
      },
      "patch": {
        "x-controller-name": "WalletController",
        "x-operation-name": "updateById",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Wallet PATCH success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletPartial"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "WalletController.updateById"
      },
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "findById",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Wallet model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletWithRelations"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          },
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet.Filter1"
                }
              }
            }
          }
        ],
        "operationId": "WalletController.findById"
      },
      "delete": {
        "x-controller-name": "WalletController",
        "x-operation-name": "deleteById",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Wallet DELETE success"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "WalletController.deleteById"
      }
    },
    "/wallets": {
      "post": {
        "x-controller-name": "WalletController",
        "x-operation-name": "create",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Wallet model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewWallet"
              }
            }
          }
        },
        "operationId": "WalletController.create"
      },
      "patch": {
        "x-controller-name": "WalletController",
        "x-operation-name": "updateAll",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Wallet PATCH success count",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loopback.Count"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "where",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "title": "Wallet.WhereFilter",
                  "additionalProperties": true,
                  "x-typescript-type": "@loopback/repository#Where<Wallet>"
                }
              }
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletPartial"
              }
            }
          }
        },
        "operationId": "WalletController.updateAll"
      },
      "get": {
        "x-controller-name": "WalletController",
        "x-operation-name": "find",
        "tags": [
          "WalletController"
        ],
        "responses": {
          "200": {
            "description": "Array of Wallet model instances",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WalletWithRelations"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Wallet.Filter"
                }
              }
            }
          }
        ],
        "operationId": "WalletController.find"
      }
    }
  },
  "components": {
    "securitySchemes": {
      "jwt": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "Wallet": {
        "title": "Wallet",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "balanceBirr": {
            "type": "number",
            "minimum": 0
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          }
        },
        "additionalProperties": true
      },
      "NewWallet": {
        "title": "NewWallet",
        "type": "object",
        "description": "(tsType: Omit<Wallet, 'id'>, schemaOptions: { title: 'NewWallet', exclude: [ 'id' ] })",
        "properties": {
          "balanceBirr": {
            "type": "number",
            "minimum": 0
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          }
        },
        "additionalProperties": true,
        "x-typescript-type": "Omit<Wallet, 'id'>"
      },
      "BankWithRelations": {
        "title": "BankWithRelations",
        "type": "object",
        "description": "(tsType: BankWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "bank_name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "account_holder": {
            "type": "string"
          },
          "accountNumber": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "suspended",
              "pending"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "bank_name",
          "accountNumber"
        ],
        "additionalProperties": false,
        "x-typescript-type": "BankWithRelations"
      },
      "ReceiptWithRelations": {
        "title": "ReceiptWithRelations",
        "type": "object",
        "description": "(tsType: ReceiptWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "receiptId": {
            "type": "string"
          },
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "APPROVED",
              "REJECTED",
              "UNDER_REVIEW"
            ]
          },
          "customerName": {
            "type": "string"
          },
          "customerPhone": {
            "type": "string"
          },
          "customerEmail": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "screenshotPath": {
            "type": "string"
          },
          "adminNotes": {
            "type": "string"
          },
          "rejectionReason": {
            "type": "string"
          },
          "processedByUserId": {
            "type": "number"
          },
          "processedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "transactionId": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          },
          "user": {
            "$ref": "#/components/schemas/UserWithRelations"
          },
          "foreignKey": {},
          "bank": {
            "$ref": "#/components/schemas/BankWithRelations"
          },
          "transaction": {
            "$ref": "#/components/schemas/TransactionWithRelations"
          }
        },
        "required": [
          "receiptId",
          "amount",
          "status",
          "customerName",
          "screenshotPath"
        ],
        "additionalProperties": true,
        "x-typescript-type": "ReceiptWithRelations"
      },
      "TransactionWithRelations": {
        "title": "TransactionWithRelations",
        "type": "object",
        "description": "(tsType: TransactionWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "transactionId": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "DEPOSIT",
              "WITHDRAWAL",
              "PURCHASE",
              "TRANSFER_OUT",
              "TRANSFER_IN",
              "REFUND",
              "ADJUSTMENT"
            ]
          },
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "COMPLETED",
              "FAILED",
              "CANCELLED",
              "REJECTED"
            ]
          },
          "paymentMethod": {
            "type": "string",
            "enum": [
              "MANUAL_BANK",
              "CHAPA_GATEWAY",
              "WALLET_TRANSFER",
              "CASH",
              "ADMIN_ADJUSTMENT"
            ]
          },
          "description": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "recipientUserId": {
            "type": "number"
          },
          "recipientInfo": {
            "type": "string"
          },
          "balanceBefore": {
            "type": "number"
          },
          "balanceAfter": {
            "type": "number"
          },
          "metadata": {
            "type": "object"
          },
          "processedByUserId": {
            "type": "number"
          },
          "processedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "recipientUser": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "receiptId": {
            "type": "number"
          },
          "user": {
            "$ref": "#/components/schemas/UserWithRelations"
          },
          "foreignKey": {},
          "recipient": {
            "$ref": "#/components/schemas/UserWithRelations"
          },
          "bank": {
            "$ref": "#/components/schemas/BankWithRelations"
          },
          "receipt": {
            "$ref": "#/components/schemas/ReceiptWithRelations"
          }
        },
        "required": [
          "transactionId",
          "type",
          "amount",
          "status",
          "paymentMethod"
        ],
        "additionalProperties": true,
        "x-typescript-type": "TransactionWithRelations"
      },
      "UserWithRelations": {
        "title": "UserWithRelations",
        "type": "object",
        "description": "(tsType: UserWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "telegramId": {
            "type": "string"
          },
          "telegramUsername": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "userType": {
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "wallet": {
            "$ref": "#/components/schemas/WalletWithRelations"
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionWithRelations"
            }
          }
        },
        "required": [
          "firstName"
        ],
        "additionalProperties": true,
        "x-typescript-type": "UserWithRelations"
      },
      "WalletWithRelations": {
        "title": "WalletWithRelations",
        "type": "object",
        "description": "(tsType: WalletWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "balanceBirr": {
            "type": "number",
            "minimum": 0
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "user": {
            "$ref": "#/components/schemas/UserWithRelations"
          },
          "foreignKey": {},
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionWithRelations"
            }
          }
        },
        "additionalProperties": true,
        "x-typescript-type": "WalletWithRelations"
      },
      "WalletPartial": {
        "title": "WalletPartial",
        "type": "object",
        "description": "(tsType: Partial<Wallet>, schemaOptions: { partial: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "balanceBirr": {
            "type": "number",
            "minimum": 0
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          }
        },
        "additionalProperties": true,
        "x-typescript-type": "Partial<Wallet>"
      },
      "User": {
        "title": "User",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "telegramId": {
            "type": "string"
          },
          "telegramUsername": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "userType": {
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "firstName"
        ],
        "additionalProperties": true
      },
      "Date": {},
      "Transaction": {
        "title": "Transaction",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "transactionId": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "DEPOSIT",
              "WITHDRAWAL",
              "PURCHASE",
              "TRANSFER_OUT",
              "TRANSFER_IN",
              "REFUND",
              "ADJUSTMENT"
            ]
          },
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "COMPLETED",
              "FAILED",
              "CANCELLED",
              "REJECTED"
            ]
          },
          "paymentMethod": {
            "type": "string",
            "enum": [
              "MANUAL_BANK",
              "CHAPA_GATEWAY",
              "WALLET_TRANSFER",
              "CASH",
              "ADMIN_ADJUSTMENT"
            ]
          },
          "description": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "recipientUserId": {
            "type": "number"
          },
          "recipientInfo": {
            "type": "string"
          },
          "balanceBefore": {
            "type": "number"
          },
          "balanceAfter": {
            "type": "number"
          },
          "metadata": {
            "type": "object"
          },
          "processedByUserId": {
            "type": "number"
          },
          "processedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "recipientUser": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "receiptId": {
            "type": "number"
          }
        },
        "required": [
          "transactionId",
          "type",
          "amount",
          "status",
          "paymentMethod"
        ],
        "additionalProperties": true
      },
      "TransactionPartial": {
        "title": "TransactionPartial",
        "type": "object",
        "description": "(tsType: Partial<Transaction>, schemaOptions: { partial: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "transactionId": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "DEPOSIT",
              "WITHDRAWAL",
              "PURCHASE",
              "TRANSFER_OUT",
              "TRANSFER_IN",
              "REFUND",
              "ADJUSTMENT"
            ]
          },
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "COMPLETED",
              "FAILED",
              "CANCELLED",
              "REJECTED"
            ]
          },
          "paymentMethod": {
            "type": "string",
            "enum": [
              "MANUAL_BANK",
              "CHAPA_GATEWAY",
              "WALLET_TRANSFER",
              "CASH",
              "ADMIN_ADJUSTMENT"
            ]
          },
          "description": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "recipientUserId": {
            "type": "number"
          },
          "recipientInfo": {
            "type": "string"
          },
          "balanceBefore": {
            "type": "number"
          },
          "balanceAfter": {
            "type": "number"
          },
          "metadata": {
            "type": "object"
          },
          "processedByUserId": {
            "type": "number"
          },
          "processedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "recipientUser": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "receiptId": {
            "type": "number"
          }
        },
        "additionalProperties": true,
        "x-typescript-type": "Partial<Transaction>"
      },
      "Receipt": {
        "title": "Receipt",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "receiptId": {
            "type": "string"
          },
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "APPROVED",
              "REJECTED",
              "UNDER_REVIEW"
            ]
          },
          "customerName": {
            "type": "string"
          },
          "customerPhone": {
            "type": "string"
          },
          "customerEmail": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "screenshotPath": {
            "type": "string"
          },
          "adminNotes": {
            "type": "string"
          },
          "rejectionReason": {
            "type": "string"
          },
          "processedByUserId": {
            "type": "number"
          },
          "processedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "userId": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "transactionId": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          }
        },
        "required": [
          "receiptId",
          "amount",
          "status",
          "customerName",
          "screenshotPath"
        ],
        "additionalProperties": true
      },
      "NewReceipt": {
        "title": "NewReceipt",
        "type": "object",
        "description": "(tsType: Omit<Receipt, 'id' | 'receiptId' | 'status' | 'transactionId' | 'processedByUserId' | 'processedAt' | 'createdAt' | 'updatedAt'>, schemaOptions: { title: 'NewReceipt', exclude: [ 'id', 'receiptId', 'status', 'transactionId', 'processedByUserId', 'processedAt', 'createdAt', 'updatedAt' ] })",
        "properties": {
          "amount": {
            "type": "number",
            "minimum": 0.01
          },
          "customerName": {
            "type": "string"
          },
          "customerPhone": {
            "type": "string"
          },
          "customerEmail": {
            "type": "string"
          },
          "reference": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "screenshotPath": {
            "type": "string"
          },
          "adminNotes": {
            "type": "string"
          },
          "rejectionReason": {
            "type": "string"
          },
          "userId": {
            "type": "number"
          },
          "bankId": {
            "type": "number"
          },
          "processedBy": {
            "type": "number"
          }
        },
        "required": [
          "amount",
          "customerName",
          "screenshotPath"
        ],
        "additionalProperties": true,
        "x-typescript-type": "Omit<Receipt, 'id' | 'receiptId' | 'status' | 'transactionId' | 'processedByUserId' | 'processedAt' | 'createdAt' | 'updatedAt'>"
      },
      "Provider": {
        "title": "Provider",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "api": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "adapter": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "name",
          "api",
          "key"
        ],
        "additionalProperties": false
      },
      "NewProvider": {
        "title": "NewProvider",
        "type": "object",
        "description": "(tsType: Omit<Provider, 'id' | 'createdAt' | 'updatedAt'>, schemaOptions: { title: 'NewProvider', exclude: [ 'id', 'createdAt', 'updatedAt' ] })",
        "properties": {
          "name": {
            "type": "string"
          },
          "api": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "adapter": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "api",
          "key"
        ],
        "additionalProperties": false,
        "x-typescript-type": "Omit<Provider, 'id' | 'createdAt' | 'updatedAt'>"
      },
      "OrderWithRelations": {
        "title": "OrderWithRelations",
        "type": "object",
        "description": "(tsType: OrderWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "userId": {
            "type": "number"
          },
          "serviceId": {
            "type": "number"
          },
          "transactionId": {
            "type": "number"
          },
          "providerId": {
            "type": "number"
          },
          "orderNumber": {
            "type": "string"
          },
          "orderCode": {
            "type": "string"
          },
          "fulfillmentPayload": {
            "type": "string"
          },
          "fulfillmentMode": {
            "type": "string",
            "enum": [
              "auto",
              "manual"
            ]
          },
          "deliveredByAdminId": {
            "type": "number"
          },
          "targetUrl": {
            "type": "string"
          },
          "quantity": {
            "type": "number"
          },
          "unitPriceEtb": {
            "type": "number"
          },
          "totalPriceEtb": {
            "type": "number"
          },
          "providerCostUsd": {
            "type": "number"
          },
          "profitEtb": {
            "type": "number"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "in_progress",
              "completed",
              "cancelled",
              "failed",
              "refunded",
              "partial"
            ]
          },
          "paymentStatus": {
            "type": "string",
            "enum": [
              "pending",
              "paid",
              "failed",
              "refunded"
            ]
          },
          "providerOrderId": {
            "type": "string"
          },
          "providerServiceId": {
            "type": "string"
          },
          "lastRefillId": {
            "type": "string"
          },
          "receiptPath": {
            "type": "string"
          },
          "receiptOriginalName": {
            "type": "string"
          },
          "startCount": {
            "type": "number"
          },
          "remains": {
            "type": "number"
          },
          "notes": {
            "type": "string"
          },
          "failureReason": {
            "type": "string"
          },
          "failureCode": {
            "type": "string"
          },
          "paymentReference": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "warrantyEndsAt": {
            "type": "string",
            "format": "date-time"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          },
          "createdByAdminId": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "user": {
            "$ref": "#/components/schemas/UserWithRelations"
          },
          "foreignKey": {},
          "service": {
            "$ref": "#/components/schemas/ServiceWithRelations"
          },
          "transaction": {
            "$ref": "#/components/schemas/TransactionWithRelations"
          },
          "provider": {
            "$ref": "#/components/schemas/ProviderWithRelations"
          }
        },
        "required": [
          "orderNumber",
          "quantity",
          "unitPriceEtb",
          "totalPriceEtb",
          "providerCostUsd",
          "profitEtb"
        ],
        "additionalProperties": false,
        "x-typescript-type": "OrderWithRelations"
      },
      "ServiceWithRelations": {
        "title": "ServiceWithRelations",
        "type": "object",
        "description": "(tsType: ServiceWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "providerId": {
            "type": "number"
          },
          "originalId": {
            "type": "string"
          },
          "costPriceUsd": {
            "type": "number"
          },
          "stock": {
            "type": "number"
          },
          "lastSyncedAt": {
            "type": "string",
            "format": "date-time"
          },
          "platform": {
            "type": "string"
          },
          "service_type": {
            "type": "string",
            "enum": [
              "followers",
              "likes",
              "views",
              "comments",
              "reactions",
              "members",
              "share"
            ]
          },
          "service_id": {
            "type": "string"
          },
          "provider_rate_usd": {
            "type": "number"
          },
          "selling_rate_etb": {
            "type": "number"
          },
          "exchange_rate": {
            "type": "number"
          },
          "min": {
            "type": "number"
          },
          "max": {
            "type": "number"
          },
          "provider_cost_etb_per_1000": {
            "type": "number"
          },
          "profit_etb_per_1000": {
            "type": "number"
          },
          "actual_profit_margin_percentage": {
            "type": "number"
          },
          "rate_dollar": {
            "type": "number"
          },
          "rate_birr": {
            "type": "number"
          },
          "description": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          },
          "isManual": {
            "type": "boolean"
          },
          "durationDays": {
            "type": "number"
          },
          "warrantyDays": {
            "type": "number"
          },
          "isCustom": {
            "type": "boolean"
          },
          "priceEtb": {
            "type": "number"
          },
          "costEtb": {
            "type": "number"
          },
          "deliveryNote": {
            "type": "string"
          },
          "sourceData": {
            "type": "object"
          },
          "customFields": {
            "type": "object"
          },
          "images": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "provider": {
            "$ref": "#/components/schemas/ProviderWithRelations"
          },
          "foreignKey": {},
          "orders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderWithRelations"
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "ServiceWithRelations"
      },
      "ProviderWithRelations": {
        "title": "ProviderWithRelations",
        "type": "object",
        "description": "(tsType: ProviderWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "api": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "adapter": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceWithRelations"
            }
          }
        },
        "required": [
          "name",
          "api",
          "key"
        ],
        "additionalProperties": false,
        "x-typescript-type": "ProviderWithRelations"
      },
      "ProviderPartial": {
        "title": "ProviderPartial",
        "type": "object",
        "description": "(tsType: Partial<Provider>, schemaOptions: { partial: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "api": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "adapter": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "Partial<Provider>"
      },
      "Language": {
        "title": "Language",
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "id": {
            "type": "number"
          },
          "en": {
            "type": "string"
          },
          "OR": {
            "type": "string"
          },
          "AM": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "en",
          "OR"
        ],
        "additionalProperties": false
      },
      "NewLanguage": {
        "title": "NewLanguage",
        "type": "object",
        "description": "(tsType: Omit<Language, 'id'>, schemaOptions: { title: 'NewLanguage', exclude: [ 'id' ] })",
        "properties": {
          "key": {
            "type": "string"
          },
          "en": {
            "type": "string"
          },
          "OR": {
            "type": "string"
          },
          "AM": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "en",
          "OR"
        ],
        "additionalProperties": false,
        "x-typescript-type": "Omit<Language, 'id'>"
      },
      "LanguageWithRelations": {
        "title": "LanguageWithRelations",
        "type": "object",
        "description": "(tsType: LanguageWithRelations, schemaOptions: { includeRelations: true })",
        "properties": {
          "key": {
            "type": "string"
          },
          "id": {
            "type": "number"
          },
          "en": {
            "type": "string"
          },
          "OR": {
            "type": "string"
          },
          "AM": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "en",
          "OR"
        ],
        "additionalProperties": false,
        "x-typescript-type": "LanguageWithRelations"
      },
      "LanguagePartial": {
        "title": "LanguagePartial",
        "type": "object",
        "description": "(tsType: Partial<Language>, schemaOptions: { partial: true })",
        "properties": {
          "key": {
            "type": "string"
          },
          "id": {
            "type": "number"
          },
          "en": {
            "type": "string"
          },
          "OR": {
            "type": "string"
          },
          "AM": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "Partial<Language>"
      },
      "Bank": {
        "title": "Bank",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "bank_name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "account_holder": {
            "type": "string"
          },
          "accountNumber": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "suspended",
              "pending"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "bank_name",
          "accountNumber"
        ],
        "additionalProperties": false
      },
      "NewBank": {
        "title": "NewBank",
        "type": "object",
        "description": "(tsType: Omit<Bank, 'id' | 'createdAt' | 'updatedAt' | 'logo'>, schemaOptions: { title: 'NewBank', exclude: [ 'id', 'createdAt', 'updatedAt', 'logo' ] })",
        "properties": {
          "bank_name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "account_holder": {
            "type": "string"
          },
          "accountNumber": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "suspended",
              "pending"
            ]
          }
        },
        "required": [
          "bank_name",
          "accountNumber"
        ],
        "additionalProperties": false,
        "x-typescript-type": "Omit<Bank, 'id' | 'createdAt' | 'updatedAt' | 'logo'>"
      },
      "BankPartial": {
        "title": "BankPartial",
        "type": "object",
        "description": "(tsType: Partial<Bank>, schemaOptions: { partial: true })",
        "properties": {
          "id": {
            "type": "number"
          },
          "bank_name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "account_holder": {
            "type": "string"
          },
          "accountNumber": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "inactive",
              "suspended",
              "pending"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "Partial<Bank>"
      },
      "loopback.Count": {
        "type": "object",
        "title": "loopback.Count",
        "x-typescript-type": "@loopback/repository#Count",
        "properties": {
          "count": {
            "type": "number"
          }
        }
      },
      "Bank.Filter": {
        "type": "object",
        "title": "Bank.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "bank_name": {
                    "type": "boolean"
                  },
                  "shortName": {
                    "type": "boolean"
                  },
                  "logo": {
                    "type": "boolean"
                  },
                  "account_holder": {
                    "type": "boolean"
                  },
                  "accountNumber": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "bank_name",
                    "shortName",
                    "logo",
                    "account_holder",
                    "accountNumber",
                    "status",
                    "createdAt",
                    "updatedAt"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Bank.Fields"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Bank>"
      },
      "Bank.Filter1": {
        "type": "object",
        "title": "Bank.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "Bank.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "bank_name": {
                    "type": "boolean"
                  },
                  "shortName": {
                    "type": "boolean"
                  },
                  "logo": {
                    "type": "boolean"
                  },
                  "account_holder": {
                    "type": "boolean"
                  },
                  "accountNumber": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "bank_name",
                    "shortName",
                    "logo",
                    "account_holder",
                    "accountNumber",
                    "status",
                    "createdAt",
                    "updatedAt"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Bank.Fields"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Bank>"
      },
      "Language.Filter": {
        "type": "object",
        "title": "Language.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "boolean"
                  },
                  "id": {
                    "type": "boolean"
                  },
                  "en": {
                    "type": "boolean"
                  },
                  "OR": {
                    "type": "boolean"
                  },
                  "AM": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "key",
                    "id",
                    "en",
                    "OR",
                    "AM"
                  ],
                  "example": "key"
                },
                "uniqueItems": true
              }
            ],
            "title": "Language.Fields"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Language>"
      },
      "Language.Filter1": {
        "type": "object",
        "title": "Language.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "Language.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "boolean"
                  },
                  "id": {
                    "type": "boolean"
                  },
                  "en": {
                    "type": "boolean"
                  },
                  "OR": {
                    "type": "boolean"
                  },
                  "AM": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "key",
                    "id",
                    "en",
                    "OR",
                    "AM"
                  ],
                  "example": "key"
                },
                "uniqueItems": true
              }
            ],
            "title": "Language.Fields"
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Language>"
      },
      "PingResponse": {
        "type": "object",
        "title": "PingResponse",
        "properties": {
          "greeting": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "headers": {
            "type": "object",
            "properties": {
              "Content-Type": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        }
      },
      "Provider.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "Provider.ScopeFilter"
      },
      "Provider.IncludeFilter.Items": {
        "title": "Provider.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "services"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/Provider.ScopeFilter"
          }
        }
      },
      "Provider.Filter": {
        "type": "object",
        "title": "Provider.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "name": {
                    "type": "boolean"
                  },
                  "api": {
                    "type": "boolean"
                  },
                  "key": {
                    "type": "boolean"
                  },
                  "adapter": {
                    "type": "boolean"
                  },
                  "active": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "name",
                    "api",
                    "key",
                    "adapter",
                    "active",
                    "createdAt",
                    "updatedAt"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Provider.Fields"
          },
          "include": {
            "title": "Provider.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Provider.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Provider>"
      },
      "Provider.Filter1": {
        "type": "object",
        "title": "Provider.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "Provider.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "name": {
                    "type": "boolean"
                  },
                  "api": {
                    "type": "boolean"
                  },
                  "key": {
                    "type": "boolean"
                  },
                  "adapter": {
                    "type": "boolean"
                  },
                  "active": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "name",
                    "api",
                    "key",
                    "adapter",
                    "active",
                    "createdAt",
                    "updatedAt"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Provider.Fields"
          },
          "include": {
            "title": "Provider.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Provider.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Provider>"
      },
      "Receipt.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "Receipt.ScopeFilter"
      },
      "Receipt.IncludeFilter.Items": {
        "title": "Receipt.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "user",
              "bank",
              "transaction",
              "processedBy"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/Receipt.ScopeFilter"
          }
        }
      },
      "Receipt.Filter": {
        "type": "object",
        "title": "Receipt.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "receiptId": {
                    "type": "boolean"
                  },
                  "amount": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": "boolean"
                  },
                  "customerName": {
                    "type": "boolean"
                  },
                  "customerPhone": {
                    "type": "boolean"
                  },
                  "customerEmail": {
                    "type": "boolean"
                  },
                  "reference": {
                    "type": "boolean"
                  },
                  "notes": {
                    "type": "boolean"
                  },
                  "screenshotPath": {
                    "type": "boolean"
                  },
                  "adminNotes": {
                    "type": "boolean"
                  },
                  "rejectionReason": {
                    "type": "boolean"
                  },
                  "processedByUserId": {
                    "type": "boolean"
                  },
                  "processedAt": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  },
                  "bankId": {
                    "type": "boolean"
                  },
                  "transactionId": {
                    "type": "boolean"
                  },
                  "processedBy": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Receipt.Fields"
          },
          "include": {
            "title": "Receipt.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Receipt.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Receipt>"
      },
      "Receipt.Filter1": {
        "type": "object",
        "title": "Receipt.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "Receipt.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "receiptId": {
                    "type": "boolean"
                  },
                  "amount": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": "boolean"
                  },
                  "customerName": {
                    "type": "boolean"
                  },
                  "customerPhone": {
                    "type": "boolean"
                  },
                  "customerEmail": {
                    "type": "boolean"
                  },
                  "reference": {
                    "type": "boolean"
                  },
                  "notes": {
                    "type": "boolean"
                  },
                  "screenshotPath": {
                    "type": "boolean"
                  },
                  "adminNotes": {
                    "type": "boolean"
                  },
                  "rejectionReason": {
                    "type": "boolean"
                  },
                  "processedByUserId": {
                    "type": "boolean"
                  },
                  "processedAt": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  },
                  "bankId": {
                    "type": "boolean"
                  },
                  "transactionId": {
                    "type": "boolean"
                  },
                  "processedBy": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Receipt.Fields"
          },
          "include": {
            "title": "Receipt.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Receipt.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Receipt>"
      },
      "Transaction.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "Transaction.ScopeFilter"
      },
      "Transaction.IncludeFilter.Items": {
        "title": "Transaction.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "user",
              "recipient",
              "processedBy",
              "bank",
              "receipt"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/Transaction.ScopeFilter"
          }
        }
      },
      "Transaction.Filter": {
        "type": "object",
        "title": "Transaction.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "transactionId": {
                    "type": "boolean"
                  },
                  "type": {
                    "type": "boolean"
                  },
                  "amount": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": "boolean"
                  },
                  "paymentMethod": {
                    "type": "boolean"
                  },
                  "description": {
                    "type": "boolean"
                  },
                  "reference": {
                    "type": "boolean"
                  },
                  "recipientUserId": {
                    "type": "boolean"
                  },
                  "recipientInfo": {
                    "type": "boolean"
                  },
                  "balanceBefore": {
                    "type": "boolean"
                  },
                  "balanceAfter": {
                    "type": "boolean"
                  },
                  "metadata": {
                    "type": "boolean"
                  },
                  "processedByUserId": {
                    "type": "boolean"
                  },
                  "processedAt": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  },
                  "recipientUser": {
                    "type": "boolean"
                  },
                  "processedBy": {
                    "type": "boolean"
                  },
                  "bankId": {
                    "type": "boolean"
                  },
                  "receiptId": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Transaction.Fields"
          },
          "include": {
            "title": "Transaction.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Transaction.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Transaction>"
      },
      "Wallet.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "Wallet.ScopeFilter"
      },
      "Wallet.IncludeFilter.Items": {
        "title": "Wallet.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "user",
              "transactions"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/Wallet.ScopeFilter"
          }
        }
      },
      "Wallet.Filter": {
        "type": "object",
        "title": "Wallet.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "Wallet.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "balanceBirr": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Wallet.Fields"
          },
          "include": {
            "title": "Wallet.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Wallet.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Wallet>"
      },
      "Wallet.Filter1": {
        "type": "object",
        "title": "Wallet.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "balanceBirr": {
                    "type": "boolean"
                  },
                  "createdAt": {
                    "type": "boolean"
                  },
                  "updatedAt": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "Wallet.Fields"
          },
          "include": {
            "title": "Wallet.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Wallet.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<Wallet>"
      }
    }
  },
  "security": [
    {
      "jwt": []
    }
  ],
  "servers": [
    {
      "url": "https://167.235.236.91.sslip.io"
    }
  ]
}