{
  "openapi": "3.0.3",
  "info": { "title": "API m2m.ma", "version": "1.0.0", "description": "Créez et suivez vos factures depuis votre site. Appelez cette API depuis votre serveur uniquement : les appels depuis un navigateur sont refusés. Limite : 120 requêtes par minute et par clé." },
  "servers": [{ "url": "https://my.m2m.ma/api/v1" }],
  "security": [{ "cleApi": [] }],
  "paths": {
    "/company": { "get": { "summary": "Entreprise liée à la clé", "responses": { "200": { "description": "Entreprise" }, "401": { "$ref": "#/components/responses/Erreur" } } } },
    "/bank-accounts": { "get": { "summary": "Comptes bancaires", "responses": { "200": { "description": "Liste des comptes" } } } },
    "/invoices": {
      "get": {
        "summary": "Liste des factures",
        "parameters": [
          { "name": "external_id", "in": "query", "schema": { "type": "string" } },
          { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 50, "maximum": 200 } }
        ],
        "responses": { "200": { "description": "Factures" } }
      },
      "post": {
        "summary": "Créer une facture",
        "description": "Renvoyer le même external_id rend la facture existante : jamais de doublon.",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NouvelleFacture" } } } },
        "responses": {
          "201": { "description": "Facture créée" },
          "200": { "description": "Facture déjà créée avec cet external_id" },
          "400": { "$ref": "#/components/responses/Erreur" },
          "402": { "$ref": "#/components/responses/Erreur" },
          "429": { "$ref": "#/components/responses/Erreur" }
        }
      }
    },
    "/invoices/{id}": { "parameters": [{ "$ref": "#/components/parameters/Id" }], "get": { "summary": "Détail d'une facture", "responses": { "200": { "description": "Facture" }, "404": { "$ref": "#/components/responses/Erreur" } } } },
    "/invoices/{id}/pdf": { "parameters": [{ "$ref": "#/components/parameters/Id" }], "get": { "summary": "Télécharger le PDF", "responses": { "200": { "description": "PDF", "content": { "application/pdf": {} } } } } },
    "/invoices/{id}/validate": { "parameters": [{ "$ref": "#/components/parameters/Id" }], "post": { "summary": "Valider un brouillon", "responses": { "200": { "description": "Facture validée" } } } },
    "/invoices/{id}/send": {
      "parameters": [{ "$ref": "#/components/parameters/Id" }],
      "post": { "summary": "Envoyer la facture par e-mail", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "to": { "type": "string" } } } } } }, "responses": { "200": { "description": "Facture envoyée" } } }
    }
  },
  "components": {
    "securitySchemes": { "cleApi": { "type": "http", "scheme": "bearer" } },
    "parameters": { "Id": { "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } } },
    "responses": { "Erreur": { "description": "Erreur", "content": { "application/json": { "schema": { "type": "object", "properties": { "error": { "type": "string" } } } } } } },
    "schemas": {
      "NouvelleFacture": {
        "type": "object",
        "required": ["customer", "lines"],
        "properties": {
          "external_id": { "type": "string", "maxLength": 100, "description": "Numéro de commande dans votre site" },
          "customer": {
            "type": "object",
            "required": ["name"],
            "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "ice": { "type": "string", "pattern": "^[0-9]{15}$" }, "if_number": { "type": "string" }, "address": { "type": "string" }, "city": { "type": "string" }, "phone": { "type": "string" } }
          },
          "date": { "type": "string", "format": "date" },
          "due_date": { "type": "string", "format": "date" },
          "payment_mode": { "type": "string" },
          "notes": { "type": "string" },
          "vat_regime": { "type": "string", "enum": ["normal", "export", "zone_franche"] },
          "prices_include_vat": { "type": "boolean" },
          "validate": { "type": "boolean" },
          "send_email": { "type": "boolean" },
          "payment": { "type": "object", "properties": { "amount": { "type": "number" }, "date": { "type": "string", "format": "date" }, "method": { "type": "string" }, "bank_account_id": { "type": "integer" } } },
          "lines": {
            "type": "array",
            "minItems": 1,
            "maxItems": 200,
            "items": {
              "type": "object",
              "required": ["description", "unit_price"],
              "properties": { "description": { "type": "string" }, "quantity": { "type": "number", "default": 1 }, "unit_price": { "type": "number" }, "vat_rate": { "type": "number" }, "account_code": { "type": "string" } }
            }
          }
        }
      }
    }
  }
}
