{
  "models": {
    "sale.subscription": {
      "fields": [
        {"name": "id", "type": "integer", "desc": "Odoo internal ID"},
        {"name": "name", "type": "char", "desc": "Subscription reference/code"},
        {"name": "partner_id", "type": "many2one(res.partner)", "desc": "Customer"},
        {"name": "company_id", "type": "many2one(res.company)"},
        {"name": "template_id", "type": "many2one(sale.subscription.template)", "desc": "Plan template"},
        {"name": "start_date", "type": "date"},
        {"name": "close_date", "type": "date|null"},
        {
          "name": "state",
          "type": "selection",
          "values": ["draft", "in_progress", "to_renew", "closed", "cancel"],
          "desc": "Lifecycle state (exact labels may vary slightly by Odoo version)"
        },
        {"name": "stage_id", "type": "many2one(sale.subscription.stage)", "desc": "Kanban stage"},
        {"name": "recurring_interval", "type": "integer", "desc": "e.g., 1, 3, 12"},
        {
          "name": "recurring_rule_type",
          "type": "selection",
          "values": ["daily", "weekly", "monthly", "yearly"]
        },
        {"name": "recurring_next_date", "type": "date", "desc": "Next planned invoice date"},
        {"name": "last_invoice_date", "type": "date|null"},
        {"name": "pricelist_id", "type": "many2one(product.pricelist)"},
        {"name": "currency_id", "type": "many2one(res.currency)"},
        {"name": "payment_term_id", "type": "many2one(account.payment.term)"},
        {"name": "payment_token_id", "type": "many2one(payment.token)", "desc": "Saved payment method (auto-charge)"},
        {"name": "invoice_count", "type": "integer"},
        {"name": "amount_recurring", "type": "monetary", "desc": "Recurring subtotal (computed)"},
        {"name": "amount_tax", "type": "monetary"},
        {"name": "amount_total", "type": "monetary"},
        {"name": "line_ids", "type": "one2many(sale.subscription.line)"},
        {"name": "tag_ids", "type": "many2many(sale.subscription.tag)"},
        {"name": "user_id", "type": "many2one(res.users)", "desc": "Salesperson"},
        {"name": "team_id", "type": "many2one(crm.team)"},
        {"name": "note", "type": "text"},
        {"name": "website_url", "type": "char", "desc": "Portal URL"},
        {"name": "create_date", "type": "datetime"},
        {"name": "write_date", "type": "datetime", "desc": "Last modification timestamp"}
      ]
    },
    "sale.subscription.line": {
      "fields": [
        {"name": "id", "type": "integer"},
        {"name": "subscription_id", "type": "many2one(sale.subscription)"},
        {"name": "product_id", "type": "many2one(product.product)"},
        {"name": "name", "type": "char", "desc": "Line description"},
        {"name": "quantity", "type": "float"},
        {"name": "uom_id", "type": "many2one(uom.uom)"},
        {"name": "price_unit", "type": "monetary"},
        {"name": "discount", "type": "float"},
        {"name": "currency_id", "type": "many2one(res.currency)"},
        {
          "name": "display_type",
          "type": "selection",
          "values": ["line", "section", "note"]
        }
      ]
    },
    "account.move (invoices)": {
      "fields": [
        {"name": "id", "type": "integer"},
        {"name": "name", "type": "char", "desc": "Invoice number"},
        {
          "name": "move_type",
          "type": "selection",
          "values": ["out_invoice", "out_refund"]
        },
        {
          "name": "state",
          "type": "selection",
          "values": ["draft", "posted", "cancel"]
        },
        {"name": "invoice_date", "type": "date"},
        {"name": "invoice_date_due", "type": "date"},
        {"name": "amount_untaxed", "type": "monetary"},
        {"name": "amount_tax", "type": "monetary"},
        {"name": "amount_total", "type": "monetary"},
        {
          "name": "payment_state",
          "type": "selection",
          "values": ["not_paid", "in_payment", "paid", "partial", "reversed"]
        },
        {"name": "invoice_line_ids", "type": "one2many(account.move.line)"},
        {"name": "payment_reference", "type": "char"},
        {"name": "ref", "type": "char"},
        {"name": "create_date", "type": "datetime"}
      ]
    },
    "payment.transaction": {
      "fields": [
        {"name": "id", "type": "integer"},
        {"name": "reference", "type": "char"},
        {"name": "acquirer_id", "type": "many2one(payment.acquirer)"},
        {
          "name": "state",
          "type": "selection",
          "values": ["draft", "pending", "authorized", "done", "cancel", "error"]
        },
        {"name": "amount", "type": "monetary"},
        {"name": "currency_id", "type": "many2one(res.currency)"},
        {"name": "date", "type": "datetime"}
      ]
    },
    "res.partner (customer)": {
      "fields": [
        {"name": "id", "type": "integer"},
        {"name": "name", "type": "char"},
        {"name": "email", "type": "char"},
        {"name": "phone", "type": "char"},
        {"name": "commercial_partner_id", "type": "many2one(res.partner)"},
        {"name": "street", "type": "char"},
        {"name": "city", "type": "char"},
        {"name": "country_id", "type": "many2one(res.country)"}
      ]
    }
  },
  "custom_fields_recommended": [
    {"model": "sale.subscription", "name": "abs_service_plan_id", "type": "char", "desc": "ABS unique ID for the plan instance"},
    {"model": "sale.subscription", "name": "abs_last_event_ts", "type": "datetime", "desc": "Last ABS event timestamp received"},
    {"model": "sale.subscription", "name": "abs_status", "type": "char", "desc": "Optional mirror of ABS FSM label"},
    {"model": "sale.subscription.line", "name": "abs_usage_ref", "type": "char", "desc": "Optional ABS usage/milestone reference driving extra invoices"}
  ],
  "sync_keys": [
    "sale.subscription.id",
    "sale.subscription.write_date",
    "sale.subscription.state",
    "sale.subscription.recurring_next_date"
  ]
}
