{
  "trades": {
    "name": "trades",
    "title": "معاملات",
    "fields": [
      {
        "key": "id",
        "label": "شناسه",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "documentNumber",
        "label": "شماره سند",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "profitStatus",
        "label": "وضعیت سود",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerId",
        "label": "شناسه مشتری",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerName",
        "label": "نام مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerCode",
        "label": "کد مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerPhone",
        "label": "تلفن",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "receivedCurrency",
        "label": "ارز دریافتی",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "receivedAmount",
        "label": "اصل دریافتی",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "receivedCurrency"
      },
      {
        "key": "paidCurrency",
        "label": "ارز پرداختی",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "paidAmount",
        "label": "مبلغ پرداختی",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "paidCurrency"
      },
      {
        "key": "agreedRate",
        "label": "نرخ توافقی",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "receivedEurRate",
        "label": "نرخ یورویی دریافتی",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "paidEurRate",
        "label": "نرخ یورویی پرداختی",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "feePercent",
        "label": "درصد کارمزد",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "feeAmount",
        "label": "کارمزد ارزی",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "receivedCurrency"
      },
      {
        "key": "feeEur",
        "label": "کارمزد یورویی",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "costBasisEur",
        "label": "بهای تمام‌شده",
        "type": "decimal",
        "nullable": true,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "exchangeProfitEur",
        "label": "سود خریدوفروش",
        "type": "decimal",
        "nullable": true,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "status",
        "label": "وضعیت",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "createdAt",
        "label": "زمان",
        "type": "datetime",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "notes",
        "label": "توضیحات",
        "type": "string",
        "nullable": true,
        "sortable": false
      }
    ],
    "defaultFields": [
      "id",
      "documentNumber",
      "customerName",
      "receivedAmount",
      "receivedCurrency",
      "paidAmount",
      "paidCurrency",
      "feeEur",
      "exchangeProfitEur",
      "profitStatus",
      "status",
      "createdAt"
    ],
    "defaultSort": {
      "field": "createdAt",
      "direction": "desc"
    },
    "filters": [
      {
        "key": "customerId",
        "required": false,
        "type": "integer"
      },
      {
        "key": "currency",
        "required": false,
        "type": "string"
      },
      {
        "key": "from",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": false
      },
      {
        "key": "to",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": true
      },
      {
        "key": "customerActive",
        "required": false,
        "type": "boolean"
      },
      {
        "key": "status",
        "required": false,
        "type": "enum",
        "values": [
          "POSTED",
          "VOID"
        ]
      },
      {
        "key": "minAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      },
      {
        "key": "maxAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      }
    ],
    "search": {
      "fields": [
        "customerName",
        "customerCode",
        "customerPhone",
        "documentNumber"
      ],
      "maxLength": 150,
      "literal": true
    },
    "pagination": {
      "defaultLimit": 25,
      "maxLimit": 100,
      "maxOffset": 100000
    },
    "roles": [
      "ADMIN",
      "CASHIER",
      "VIEWER"
    ],
    "notes": "Financial summary excludes VOID documents even if shown as rows."
  },
  "payments": {
    "name": "payments",
    "title": "دریافت و پرداخت",
    "fields": [
      {
        "key": "id",
        "label": "شناسه",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "documentNumber",
        "label": "شماره سند",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "unallocatedAmount",
        "label": "تخصیص‌نیافته",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "currencyCode"
      },
      {
        "key": "customerId",
        "label": "شناسه مشتری",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerName",
        "label": "نام مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerCode",
        "label": "کد مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerPhone",
        "label": "تلفن",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "tradeId",
        "label": "معامله",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "currencyCode",
        "label": "ارز",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "direction",
        "label": "نوع",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "amount",
        "label": "مبلغ",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "currencyCode"
      },
      {
        "key": "eurRate",
        "label": "نرخ یورو",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "eurAmount",
        "label": "معادل یورو",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "status",
        "label": "وضعیت",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "createdAt",
        "label": "زمان",
        "type": "datetime",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "notes",
        "label": "توضیحات",
        "type": "string",
        "nullable": true,
        "sortable": false
      }
    ],
    "defaultFields": [
      "id",
      "documentNumber",
      "customerName",
      "currencyCode",
      "direction",
      "amount",
      "unallocatedAmount",
      "eurRate",
      "status",
      "createdAt"
    ],
    "defaultSort": {
      "field": "createdAt",
      "direction": "desc"
    },
    "filters": [
      {
        "key": "customerId",
        "required": false,
        "type": "integer"
      },
      {
        "key": "currency",
        "required": false,
        "type": "string"
      },
      {
        "key": "from",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": false
      },
      {
        "key": "to",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": true
      },
      {
        "key": "customerActive",
        "required": false,
        "type": "boolean"
      },
      {
        "key": "status",
        "required": false,
        "type": "enum",
        "values": [
          "POSTED",
          "VOID"
        ]
      },
      {
        "key": "direction",
        "required": false,
        "type": "enum",
        "values": [
          "RECEIVE",
          "PAY"
        ]
      },
      {
        "key": "tradeId",
        "required": false,
        "type": "string"
      },
      {
        "key": "minAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      },
      {
        "key": "maxAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      }
    ],
    "search": {
      "fields": [
        "customerName",
        "customerCode",
        "customerPhone",
        "documentNumber"
      ],
      "maxLength": 150,
      "literal": true
    },
    "pagination": {
      "defaultLimit": 25,
      "maxLimit": 100,
      "maxOffset": 100000
    },
    "roles": [
      "ADMIN",
      "CASHIER",
      "VIEWER"
    ],
    "notes": "Financial summary excludes VOID documents even if shown as rows."
  },
  "statement": {
    "name": "statement",
    "title": "گردش حساب",
    "fields": [
      {
        "key": "id",
        "label": "شناسه ردیف",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerId",
        "label": "شناسه مشتری",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerName",
        "label": "نام مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerCode",
        "label": "کد مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerPhone",
        "label": "تلفن",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "currencyCode",
        "label": "ارز",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "amount",
        "label": "تغییر مانده",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "currencyCode"
      },
      {
        "key": "runningBalance",
        "label": "مانده پس از ردیف",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "currencyCode"
      },
      {
        "key": "eurRate",
        "label": "نرخ سند",
        "type": "decimal",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "eurAmount",
        "label": "معادل تغییر",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "source",
        "label": "نوع سند",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "tradeId",
        "label": "معامله",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "paymentId",
        "label": "پرداخت",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "openingId",
        "label": "افتتاحیه",
        "type": "integer",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "reversalOf",
        "label": "برگشت ردیف",
        "type": "integer",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "createdAt",
        "label": "زمان",
        "type": "datetime",
        "nullable": false,
        "sortable": true
      }
    ],
    "defaultFields": [
      "id",
      "customerName",
      "currencyCode",
      "amount",
      "runningBalance",
      "source",
      "createdAt"
    ],
    "defaultSort": {
      "field": "createdAt",
      "direction": "asc"
    },
    "filters": [
      {
        "key": "customerId",
        "required": true,
        "type": "integer"
      },
      {
        "key": "currency",
        "required": false,
        "type": "string"
      },
      {
        "key": "from",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": false
      },
      {
        "key": "to",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": true
      },
      {
        "key": "customerActive",
        "required": false,
        "type": "boolean"
      },
      {
        "key": "source",
        "required": false,
        "type": "enum",
        "values": [
          "TRADE",
          "PAYMENT",
          "OPENING",
          "REVERSAL"
        ]
      },
      {
        "key": "minAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      },
      {
        "key": "maxAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      }
    ],
    "search": {
      "fields": [
        "customerName",
        "customerCode",
        "customerPhone"
      ],
      "maxLength": 150,
      "literal": true
    },
    "pagination": {
      "defaultLimit": 25,
      "maxLimit": 100,
      "maxOffset": 100000
    },
    "roles": [
      "ADMIN",
      "CASHIER",
      "VIEWER"
    ],
    "notes": "Running balances include all ledger history before filtering/pagination. Opening ignores source/amount filters."
  },
  "balances": {
    "name": "balances",
    "title": "مانده بدهی و طلب",
    "fields": [
      {
        "key": "customerId",
        "label": "شناسه مشتری",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerName",
        "label": "نام مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerCode",
        "label": "کد مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerPhone",
        "label": "تلفن",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "currencyCode",
        "label": "ارز",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "amount",
        "label": "مانده",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currencyField": "currencyCode"
      },
      {
        "key": "side",
        "label": "سمت مانده",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "eurEquivalent",
        "label": "معادل یورویی فعلی",
        "type": "decimal",
        "nullable": true,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "eurRate",
        "label": "نرخ فعلی",
        "type": "decimal",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "rateStatus",
        "label": "وضعیت نرخ",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "rateUpdatedAt",
        "label": "زمان نرخ",
        "type": "datetime",
        "nullable": true,
        "sortable": true
      }
    ],
    "defaultFields": [
      "customerId",
      "customerName",
      "currencyCode",
      "amount",
      "side",
      "eurEquivalent",
      "rateStatus",
      "rateUpdatedAt"
    ],
    "defaultSort": {
      "field": "customerId",
      "direction": "asc"
    },
    "filters": [
      {
        "key": "customerId",
        "required": false,
        "type": "integer"
      },
      {
        "key": "currency",
        "required": false,
        "type": "string"
      },
      {
        "key": "customerActive",
        "required": false,
        "type": "boolean"
      },
      {
        "key": "asOf",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": true
      },
      {
        "key": "side",
        "required": false,
        "type": "enum",
        "values": [
          "CUSTOMER_OWES",
          "CUSTOMER_IS_OWED",
          "SETTLED"
        ]
      },
      {
        "key": "minAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      },
      {
        "key": "maxAmount",
        "required": false,
        "type": "decimal",
        "requires": "currency"
      }
    ],
    "search": {
      "fields": [
        "customerName",
        "customerCode",
        "customerPhone"
      ],
      "maxLength": 150,
      "literal": true
    },
    "pagination": {
      "defaultLimit": 25,
      "maxLimit": 100,
      "maxOffset": 100000
    },
    "roles": [
      "ADMIN",
      "CASHIER",
      "VIEWER"
    ],
    "notes": "One row per customer/currency. asOf excludes the cutoff; valuation uses current rates, not historical rates."
  },
  "customer-profit": {
    "name": "customer-profit",
    "title": "سود مشتریان",
    "fields": [
      {
        "key": "customerId",
        "label": "شناسه مشتری",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerName",
        "label": "نام مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerCode",
        "label": "کد مشتری",
        "type": "string",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "customerPhone",
        "label": "تلفن",
        "type": "string",
        "nullable": true,
        "sortable": true
      },
      {
        "key": "tradeCount",
        "label": "تعداد معاملات",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "feeRevenueEur",
        "label": "کارمزد",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "knownExchangeProfitEur",
        "label": "سود معلوم",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "knownSubtotalEur",
        "label": "جمع مبالغ معلوم",
        "type": "decimal",
        "nullable": false,
        "sortable": true,
        "currency": "EUR"
      },
      {
        "key": "unknownProfitTrades",
        "label": "سود نامشخص",
        "type": "integer",
        "nullable": false,
        "sortable": true
      },
      {
        "key": "totalProfitEur",
        "label": "سود کل",
        "type": "decimal",
        "nullable": true,
        "sortable": true,
        "currency": "EUR"
      }
    ],
    "defaultFields": [
      "customerId",
      "customerName",
      "tradeCount",
      "feeRevenueEur",
      "knownExchangeProfitEur",
      "unknownProfitTrades",
      "totalProfitEur"
    ],
    "defaultSort": {
      "field": "feeRevenueEur",
      "direction": "desc"
    },
    "filters": [
      {
        "key": "customerId",
        "required": false,
        "type": "integer"
      },
      {
        "key": "currency",
        "required": false,
        "type": "string"
      },
      {
        "key": "from",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": false
      },
      {
        "key": "to",
        "required": false,
        "type": "datetime",
        "timezone": "UTC",
        "exclusiveUpperBound": true
      },
      {
        "key": "customerActive",
        "required": false,
        "type": "boolean"
      }
    ],
    "search": {
      "fields": [
        "customerName",
        "customerCode",
        "customerPhone"
      ],
      "maxLength": 150,
      "literal": true
    },
    "pagination": {
      "defaultLimit": 25,
      "maxLimit": 100,
      "maxOffset": 100000
    },
    "roles": [
      "ADMIN",
      "CASHIER",
      "VIEWER"
    ],
    "notes": "Only customers with matching POSTED trades. Unknown costs make totalProfitEur null."
  }
}