{
  "openapi":"3.0.1",
  "info":{
     "title":"Services Web du Module Fiscal",
     "description":"Télécharger la collection Postman : <a href='postmanCols/Tunisian_NACEF_Integration-1.0.0_postman_collection.json' download='Tunisian_NACEF_Integration-1.0.0_postman_collection.json' rel='noopener noreferrer' style='border: 1px solid #4C87E8;color: #3578E5;font-weight: normal;margin-left: 0.5em;padding: 4px 8px 4px;display: inline-block;text-decoration: none;cursor: pointer;'>Télécharger</a> \n \n Spécifications des services web à utiliser pour s'interfacer avec les modules de données fiscales (S-MDF) et intégrer les logiciels de caisse avec la plateforme NACEF.",
     "version":"1.0.0",
     "contact":{
        "name":"CIMF"
     },
     "license":{
        "name":"CIMF",
        "url":"http://www.cimf.tn/"
     }
  },
  "servers":[
     {
        "url":"http://localhost:10006",
        "description":"Default server"
     }
  ],
  "tags":[
     {
        "name":"S-MDF APIs",
        "description":"Informations opérationnelles concernant les services web."
     },
     {
        "name":"ticket_schema",
        "x-displayName":"NACEF Ticket schéma",
        "description":"Présente le schéma descriptif du ticket. \n\n Télécharger le schéma du ticket: <a href='jsonTicketDocs/nacef-smdf-ticket-1.1.4.json' download='nacef-smdf-ticket-1.1.4.json' rel='noopener noreferrer' style='border: 1px solid #4C87E8;color: #3578E5;font-weight: normal;margin-left: 0.5em;padding: 4px 8px 4px;display: inline-block;text-decoration: none;cursor: pointer;'>Télécharger</a>"
     }
  ],
  "x-tagGroups":[
     {
        "name":"Liste des Web Services",
        "tags":[
           "S-MDF APIs"
        ]
     },
     {
        "name":"Schéma JSON du ticket",
        "tags":[
           "ticket_schema"
        ]
     }
  ],
  "paths":{
     "/sic/external/sync/request":{
        "post":{
           "tags":[
              "S-MDF APIs"
           ],
           "summary":"syncRequest",
           "description":"A utiliser pour : \r<ul><li>Lancer la synchronisation du S-MDF avec la plateforme NACEF,</li>\r<li>Changer le code PIN du certificat.</li>\r<li>Changer l'URL du SMDF-Agent (valable uniquement dans le cas de l'utilisation d'un S-MDF de type serveur).</li></ul>",
           "operationId":"syncRequest",
           "requestBody":{
              "description":"En plus de l'opération de synchronisation du S-MDF, les paramètres sont à utiliser pour indiquer l'opération supplémentaire à effectuer : changement du code PIN, ou de l'URL du SMDF client.",
              "content":{
                 "application/json":{
                    "schema":{
                       "$ref":"#/components/schemas/SMDFSyncRequest"
                    }
                 }
              },
              "required":true
           },
           "responses":{
              "200":{
                 "description":"Synchronisation réalisée avec succès. Le SMDF peut être utilisé pour la signature.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/SMDFManifest"
                       }
                    }
                 }
              },
              "400":{
                 "description":"Une erreur s'est produite. Il faut vérifier le code d'erreur",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              }
           }
        }
     },
     "/sic/external/sign/request":{
        "post":{
           "tags":[
              "S-MDF APIs"
           ],
           "summary":"signatureRequest",
           "description":"Demande la signature électronique d'un ticket avant impression.",
           "operationId":"signatureRequest",
           "requestBody":{
              "description":"Les données du ticket à signer.",
              "content":{
                 "application/json":{
                    "schema":{
                       "$ref":"#/components/schemas/SMDFTicketInfo"
                    }
                 }
              },
              "required":true
           },
           "responses":{
              "200":{
                 "description":"Le ticket a été signé et peut être imprimé. La signature a été effectuée selon le mode de connexion du S-MDF (en ligne ou hors-ligne). La signature hors-ligne ne peut s'effectuer que si le S-MDF est à l'état synchronisé.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/SMDFSignedTicket"
                       }
                    }
                 }
              },
              "400":{
                 "description":"Une erreur s'est produite. Il faut vérifier le code d'erreur",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              }
           }
        }
     },
     "/sic/external/log/":{
        "post":{
           "tags":[
              "S-MDF APIs"
           ],
           "summary":"registerCELog",
           "description":"Appel pour déclarer un nouvel événement émis par la caisse enregistreuse et pour l'enregistrer dans une trace d'audit.",
           "operationId":"registerCELog",
           "requestBody":{
              "description":"Les données de l'événement à enregistrer",
              "content":{
                 "application/json":{
                    "schema":{
                       "$ref":"#/components/schemas/SICLogEntry"
                    }
                 }
              }
           },
           "responses":{
              "200":{
                 "description":"L'entrée log a été enregistrée.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              },
              "400":{
                 "description":"Une erreur s'est produite. Il faut vérifier le code d'erreur",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              }
           }
        }
     },
     "/sic/external/certificate/request":{
        "post":{
           "tags":[
              "S-MDF APIs"
           ],
           "summary":"certRequest",
           "description":"Demande de certificat éléctronique pour un S-MDF. L'appel ne peut s'effectuer qu'à l'aide de l'IMDF et du code de Pairing adéquats.",
           "operationId":"certRequest",
           "requestBody":{
              "description":"Les informations objets de la demande de certificat électronique.",
              "content":{
                 "application/json":{
                    "schema":{
                       "$ref":"#/components/schemas/SICCertificateRequest"
                    }
                 }
              }
           },
           "responses":{
              "200":{
                 "description":"La demande de certificat a été enregistrée avec succès. La demande est en attente de validation par l'administration fiscale. Le changement de l'état de la demande de certificat peut être suivi par l'opération de récupération du Manifest.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/SMDFManifest"
                       }
                    }
                 }
              },
              "400":{
                 "description":"Une erreur s'est produite. Il faut vérifier le code d'erreur",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              }
           }
        }
     },
     "/sic/external/manifest":{
        "get":{
           "tags":[
              "S-MDF APIs"
           ],
           "summary":"getManifest",
           "description":"Ce web-service permet de récupérer l'état courant (Manifest) du S-MDF.",
           "operationId":"getManifest",
           "responses":{
              "200":{
                 "description":"Manifest récupéré avec succès.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/SMDFManifest"
                       }
                    }
                 }
              },
              "400":{
                 "description":"Une erreur s'est produite (probablement le SMDF n'est pas joignable). Il faut vérifier le code d'erreur.",
                 "content":{
                    "application/json":{
                       "schema":{
                          "$ref":"#/components/schemas/Response"
                       }
                    }
                 }
              }
           }
        }
     }
  },
  "components":{
     "schemas":{
        "SMDFSyncRequest":{
           "type":"object",
           "properties":{
              "requestPINupdate":{
                 "type":"boolean",
                 "description":"Si true, le contribuable sera invité à changer son code PIN lors de cette synchronisation."
              },
              "updateSMDFURL":{
                 "type":"boolean",
                 "description":"Si true, le SIC demandera la saisie de l’URL du serveur SMDF avant de commencer la synchronisation."
              }
           }
        },
        "Response":{
           "type":"object",
           "properties":{
              "object":{
                 "type":"object"
              },
              "message":{
                 "type":"string"
              },
              "errorCode":{
                 "type":"integer",
                 "format":"int32"
              }
           }
        },
        "EquipmentVersionsInfo": {
          "type": "object",
          "properties": {
            "os": {
              "type": "string",
              "description":"Le nom de l’OS. Une des valeurs suivantes : «windows», «linux», «mac», «android» et «ios»."
            },
            "current": {
              "type": "string",
              "description":"La version actuelle."
            },
            "last": {
              "type": "string",
              "description":"La dernière version publiée."
            },
            "minimal": {
              "type": "string",
              "description":"La version minimale supportée."
            }
          }
        },
        "SMDFCertificateInfo":{
           "type":"object",
           "properties":{
              "certRequestStatus":{
                 "type":"string",
                 "description":"L’état de la demande de certificat."
              },
              "issuanceDate":{
                 "type":"string",
                 "format":"date-time",
                 "description":"Date d’émission du certificat. Contient une valeur seulement si l’état de la demande de certificat est CERTIFICATE_GENERATED."
              },
              "expirationDate":{
                 "type":"string",
                 "format":"date-time",
                 "description":"Date d’expiration du certificat. Date d’émission du certificat. Contient une valeur seulement si l’état de la demande de certificat est CERTIFICATE_GENERATED."
              },
              "expired":{
                 "type":"boolean",
                 "description":"Indication si le certificat associé à cet IMDF a expiré."
              },
              "revoked":{
                 "type":"boolean",
                 "description":"Indication si le certificat associé à cet IMDF a été révoqué."
              }
           }
        },
        "SMDFManifest":{
           "type":"object",
           "properties":{
              "imdf":{
                 "type":"string",
                 "description":"L’IMDF associé à l’équipement (S-MDF)."
              },
              "status":{
                 "type":"string",
                 "enum":[
                    "0: Not used yet. No IMDF assigned yet.",
                    "2: A certificate has been requested.",
                    "3: Suspended SMDF-Client.",
                    "4: Not synchronized. Synchronize before usage.",
                    "5: Can be used to sign tickets.",
                    "6: Synchronization process with NACEF is in progress."
                 ],
                 "description":"L’état du S-MDF."
              },
              "version":{
                 "type":"string",
                 "description":"La version du S-MDF."
              },
              "type":{
                 "type":"string",
                 "enum":[
                    "0: This SMDF runs a single equipment.",
                    "1: This SMDF runs multiple equipments."
                 ],
                 "description":"Le type du S-MDF."
              },
              "certificateInfo":{
                 "$ref":"#/components/schemas/SMDFCertificateInfo",
                 "description":"Objet JSON"
              },
              "maintenanceEnabled":{
                 "type":"boolean",
                 "description":"Si true, cet équipement a été mis en maintenance depuis NACEF. Il ne peut plus être utilisé par le logiciel de caisse."
              },
              "state":{
                 "type":"string",
                 "enum":[
                    "ONLINE",
                    "OFFLINE"
                 ]
              },
              "ticketZeroQRCode":{
                 "type":"array",
                 "items":{
                    "type":"string",
                    "format":"byte"
                 },
                 "description":"L’encodage du QRCode rapport émis par le SMDF. Lors de la première synchronisation, ce champ contient l’encodage du premier rapport (ticket0)."
              },
              "synchronizationRate":{
                 "type":"integer",
                 "format":"int32",
                 "description":"Le taux d’avancement (%) de la synchronisation entre le S-MDF et NACEF."
              },
              "versionsInfo": {
                "$ref": "#/components/schemas/SMDFVersionsInfo"
              },
              "availableOfflineTickets": {
                "type": "integer",
                "format": "int32",
                "description":"Nombre de tickets que ce SMDF peut signer s’il est utilisé «offline»."
              }
           }
        },
        "SMDFVersionsInfo": {
          "type": "object",
          "properties": {
            "smdf": {
              "type": "object",
              "description": "Les informations de version pour le SMDF.",
              "additionalProperties": {
                "$ref": "#/components/schemas/EquipmentVersionsInfo"
              }
            },
            "agents": {
              "type": "object",
              "description": "Les informations de version pour les agents attachés. Chaque agent est identifié dans la map par son adresse MAC qui a été utilisé pour se connecter.",
              "additionalProperties": {
                "$ref": "#/components/schemas/EquipmentVersionsInfo"
              }
            }
          }
        },
        "SMDFTicketInfo":{
           "type":"object",
           "properties":{
              "base64Ticket":{
                 "type":"string",
                 "description":"L’encodage en Base64 du ticket à signer."
              },
              "totalHT":{
                 "type":"integer",
                 "format":"int64",
                 "description":"Le total (en millimes) hors taxe du ticket."
              },
              "totalTax":{
                 "type":"integer",
                 "format":"int64",
                 "description":"Le total (en millimes) taxes du ticket."
              },
              "operationType":{
                 "type":"string",
                 "description":"Le type de ticket."
              },
              "transactionType":{
                 "type":"string",
                 "description":"Le type de la transaction."
              }
           }
        },
        "SMDFSignedTicket":{
           "type":"object",
           "properties":{
              "ticketIdentifier":{
                 "type":"string",
                 "description":"L’identifiant unique associé au ticket par la plateforme NACEF."
              },
              "qrcodeImage":{
                 "type":"array",
                 "items":{
                    "type":"string",
                    "format":"byte"
                 },
                 "description":"Le QR-Code à imprimer sur le ticket."
              }
           }
        },
        "SICLogEntry":{
           "type":"object",
           "properties":{
              "module":{
                 "type":"string",
                 "enum":[
                    "SMDF",
                    "SIC",
                    "LC",
                    "LC_AGENT",
                    "LC_SECURITY"
                 ],
                 "description":"L’identifiant du module du logiciel de caisse origine de la trace à enregistrer."
              },
              "operation":{
                 "type":"string",
                 "enum":[
                    "UPGRADE",
                    "CASHING",
                    "PURGE",
                    "BACKUP",
                    "RESTORE",
                    "OFFLINE",
                    "ONLINE",
                    "PARAMETERS",
                    "PRINTER",
                    "CERT_REQUEST",
                    "SYNC_REQUEST",
                    "SIGN_REQUEST",
                    "USER_LOGIN"
                 ],
                 "description":"L’identifiant désignant l’opération en question."
              },
              "level":{
                 "type":"string",
                 "enum":[
                    "INFO",
                    "WARN",
                    "ERROR",
                    "TRACE",
                    "DEBUG"
                 ],
                 "description":"Indication du niveau de la trace (information ou erreur). Les deux niveaux supportés sont : « INFO » et « ERROR »."
              },
              "message":{
                 "type":"string",
                 "description":"Texte contenant les données associées à la trace à enregistrer. Le message contient le résultat de l’exécution de l’opération, les données qui permettent d’identifier l’opération, ainsi que les données paramètres utilisées lors de l’exécution de l’opération (données complémentaires). Pour les opérations de modification les données complémentaires doivent comporter la liste des données initiales ainsi que les données de modification."
              }
           }
        },
        "SICCashRegisterInfo":{
           "type":"object",
           "properties":{
              "model":{
                 "type":"string",
                 "description":"Modèle du logiciel de caisse."
              },
              "serialNumber":{
                 "type":"string",
                 "description":"Numéro de série de l’équipement."
              },
              "version":{
                 "type":"string",
                 "description":"Version du logiciel de caisse."
              }
           },
           "description":"Des informations associées au logiciel de caisse"
        },
        "SICCertificateRequest":{
           "type":"object",
           "properties":{
              "cashRegisterInfo":{
                 "$ref":"#/components/schemas/SICCashRegisterInfo"
              }
           }
        },
        "Ticket":
        {
          "$schema": "https://json-schema.org/draft/2020-12/schema",
          "type": "object",
          "title": "NACEF Ticket payload",
          "description": "Représente les données d'une transaction de vente",
          "properties": {
              "data_type": {
                  "title": "Data type",
                  "type": "string",
                  "const": "ncf.cashier.operation",
                  "description": "Type de données pour cette opération."
              },
              "version": {
                  "title": "Version",
                  "type": "string",
                  "const": "1.1.4",
                  "description": "Version du schéma JSON"
              },
              "transaction": {
                  "title": "Transaction",
                  "type": "object",
                  "properties": {
                      "id": {
                          "title": "Transaction identifier",
                          "type": "string",
                          "minLength": 8,
                          "maxLength": 48,
                          "examples": [
                              "YYXXXXXX",
                              "YYXXXXXXXXX"
                          ],
                          "description": "Identifiant unique pour la transaction."
                      },
                      "timestamp": {
                          "title": "Timestamp",
                          "type": "string",
                          "format": "date-time",
                          "description": "Date et heure de la transaction au format ISO 8601"
                      },
                      "operation": {
                          "title": "Operation",
                          "type": "object",
                          "properties": {
                              "op_type": {
                                  "title": "Operation type",
                                  "type": "string",
                                  "enum": [
                                      "TICKET",
                                      "PROFORMA",
                                      "REFUND",
                                      "DUPLICATE"
                                  ],
                                  "description": "Type d'opération réalisée:\n - TICKET: Ticket normal\n- PROFORMA: Ticket Proforma\n- REFUND: Remboursement\n- DUPLICATE: Copie de ticket"
                              },
                              "context": {
                                  "title": "Context",
                                  "type": "string",
                                  "enum": [
                                      "SALE",
                                      "TRAINING"
                                  ],
                                  "description": "Contexte de l'opération:\n- SALE: Vente (en production)\n- TRAINING: Formation (hors production)"
                              }
                          },
                          "additionalProperties": true,
                          "description": "Type d'opération effectuée.",
                          "if": {
                              "properties": {
                                  "op_type": {
                                      "title": "Operation type",
                                      "type": "string",
                                      "const": "DUPLICATE"
                                  }
                              }
                          },
                          "then": {
                              "properties": {
                                  "duplicated_transaction_identifier": {
                                      "title": "Transaction identifier",
                                      "type": "string",
                                      "minLength": 8,
                                      "maxLength": 48,
                                      "examples": [
                                          "YYXXXXXX",
                                          "YYXXXXXXXXX"
                                      ],
                                      "description": "Identifiant unique pour la transaction."
                                  }
                              },
                              "required": [
                                  "duplicated_transaction_identifier"
                              ]
                          },
                          "required": [
                              "op_type",
                              "context"
                          ]
                      },
                      "originator": {
                          "title": "Transaction originator",
                          "type": "object",
                          "properties": {
                              "agent_identifier": {
                                  "title": "Agent identifier",
                                  "type": "string",
                                  "maxLength": 32,
                                  "minLength": 3,
                                  "description": "Identifiant de l'agent qui a réalisé la transaction."
                              },
                              "imdf": {
                                  "title": "IMDF",
                                  "type": "string",
                                  "minLength": 14,
                                  "maxLength": 16,
                                  "description": "Identifiant du module de données fiscales (MDF)"
                              },
                              "cash_register_serialnumber": {
                                  "title": "Cash register serial number",
                                  "type": "string",
                                  "minLength": 8,
                                  "maxLength": 32,
                                  "description": "Numéro de série de la caisse enregistreuse utilisée"
                              },
                              "cash_register_software": {
                                  "title": "Cash register software",
                                  "type": "string",
                                  "minLength": 8,
                                  "maxLength": 32,
                                  "description": "Nom du logiciel de caisse utilisé pour traiter la transaction"
                              },
                              "accreditation_reference": {
                                  "title": "Accreditation reference",
                                  "type": "string",
                                  "minLength": 8,
                                  "maxLength": 32,
                                  "description": "Référence du certificat d'homologation de la caisse enregistreuse."
                              }
                          },
                          "additionalProperties": false,
                          "description": "Informations sur l'entité émettrice de la transaction",
                          "required": [
                              "agent_identifier",
                              "imdf",
                              "cash_register_serialnumber",
                              "cash_register_software",
                              "accreditation_reference"
                          ]
                      }
                  },
                  "additionalProperties": false,
                  "description": "Informations sur la transaction.",
                  "required": [
                      "id",
                      "timestamp",
                      "operation",
                      "originator"
                  ]
              },
              "merchant_identity": {
                  "title": "Merchant identity",
                  "type": "object",
                  "properties": {
                      "id": {
                          "title": "Identifier code",
                          "type": "string",
                          "maxLength": 8,
                          "pattern": "^\\d{7}[A-Z]$",
                          "minLength": 8,
                          "description": "Matricule fiscal du commerçant.",
                          "format": "regex"
                      },
                      "id_type": {
                          "title": "Identifier type",
                          "type": "string",
                          "const": "MF",
                          "description": "Type identifiant du commerçant (Matricule fiscal). Constante : MF."
                      },
                      "taxpayer_establishment": {
                          "title": "Taxpayer establishment",
                          "type": "object",
                          "properties": {
                              "commercial_name": {
                                  "title": "Commercial name",
                                  "type": "string",
                                  "description": "Nom commercial de l'établissement.",
                                  "maxLength": 64
                              },
                              "reference": {
                                  "title": "Reference",
                                  "type": "string",
                                  "description": "Numéro établissement tel qu'il a été attribué par le bureau de contrôle des impôts (XXX):\n- 000 pour établissement principal\n- 00X pour établissement secondaire numéro 00X.",
                                  "pattern": "^\\d{3}$",
                                  "examples": [
                                      "000",
                                      "001"
                                  ]
                              },
                              "address": {
                                  "title": "Street address",
                                  "type": "string",
                                  "maxLength": 128,
                                  "minLength": 8,
                                  "description": "Adresse postale de l'établissement."
                              },
                              "city": {
                                  "title": "City",
                                  "type": "string",
                                  "minLength": 3,
                                  "maxLength": 32,
                                  "description": "Ville de l'établissement."
                              }
                          },
                          "additionalProperties": false,
                          "description": "Informations sur l'établissement fiscal du commerçant.",
                          "required": [
                              "commercial_name",
                              "reference",
                              "address",
                              "city"
                          ]
                      }
                  },
                  "additionalProperties": true,
                  "description": "Informations sur l'identité du commerçant.",
                  "required": [
                      "id",
                      "id_type",
                      "taxpayer_establishment"
                  ]
              },
              "customer_identity": {
                  "title": "Customer identity",
                  "type": "object",
                  "properties": {
                      "fiscal_advantages": {
                          "title": "Fiscal advantages",
                          "type": "string",
                          "description": "Référence de l'attestation d'achat en suspension de taxes, si l'opération d'achat est soumise à un avantage fiscal.",
                          "minLength": 3,
                          "maxLength": 48
                      },
                      "id_type": {
                          "title": "Identifier type",
                          "type": "string",
                          "enum": [
                              "PP",
                              "NP"
                          ],
                          "description": "Type d'identifiant du client:\n- NP: Personne physique sans document d'identité,\n- PP: Personne identifiée par un Matricule fiscal.\n"
                      },
                      "id": {
                          "title": "Identifier code",
                          "type": "string"
                      }
                  },
                  "additionalProperties": false,
                  "description": "Informations sur le client.",
                  "allOf": [
                      {
                          "type": "object",
                          "if": {
                              "properties": {
                                  "id_type": {
                                      "title": "Identifier type",
                                      "type": "string",
                                      "const": "PP"
                                  }
                              }
                          },
                          "then": {
                              "properties": {
                                  "id": {
                                      "title": "Identifier code",
                                      "type": "string",
                                      "pattern": "^\\d{7}[A-Z]$",
                                      "minLength": 8,
                                      "maxLength": 8,
                                      "format": "regex"
                                  }
                              },
                              "required": [
                                  "id"
                              ]
                          },
                          "description": "Matricule fiscal .\n"

                      }
                  ],
                  "required": [
                      "id_type"
                  ]
              },
              "sale_details": {
                  "type": "array",
                  "title": "Sale details",
                  "items": {
                      "title": "Sale item",
                      "type": "object",
                      "properties": {
                          "product": {
                              "title": "Product",
                              "type": "object",
                              "properties": {
                                  "family_code": {
                                      "title": "Family code",
                                      "type": "string",
                                      "maxLength": 8,
                                      "minLength": 2,
                                      "description": "Code famille produit telle qu'il est indiqué dans le cahier des charges."
                                  },
                                  "name": {
                                      "title": "Name",
                                      "type": "string",
                                      "maxLength": 64,
                                      "minLength": 3,
                                      "description": "Désignation du produit."
                                  },
                                  "price_pre_tax": {
                                      "title": "Price tax excluded",
                                      "type": "integer",
                                      "minimum": 1,
                                      "description": "Prix unitaire Hors Taxes. En millimes, sans séparateurs et sans point décimal."
                                  }
                              },
                              "additionalProperties": false,
                              "required": [
                                  "family_code",
                                  "name",
                                  "price_pre_tax"
                              ]
                          },
                          "taxation": {
                              "title": "Taxation",
                              "type": "array",
                              "minItems": 0,
                              "uniqueItems": true,
                              "items": {
                                  "title": "Tax",
                                  "type": "object",
                                  "properties": {
                                      "type": {
                                          "title": "Type",
                                          "type": "string",
                                          "enum": [
                                              "fixed",
                                              "percent"
                                          ],
                                          "description": "Nature de la taxe appliquée : un pourcentage ou bien une valeur fixe."
                                      },
                                      "value": {
                                          "title": "Value",
                                          "type": "number",
                                          "minimum": 0.01,
                                          "description": "Valeur de la taxe appliquée (Taux ou valeur fixe)."
                                      },
                                      "tax_code": {
                                          "title": "Tax code",
                                          "type": "string",
                                          "minLength": 1,
                                          "maxLength": 16,
                                          "description": "Code de la taxe telle qu'il est indiqué dans le cahier des charges."
                                      }
                                  },
                                  "additionalProperties": false,
                                  "required": [
                                      "type",
                                      "value",
                                      "tax_code"
                                  ]
                              }
                          },
                          "quantity": {
                              "title": "Quantity",
                              "type": "integer",
                              "minimum": 1,
                              "description": "Quantité achetée par produit."
                          },
                          "discount_per_unit": {
                              "title": "Discount",
                              "type": "object",
                              "properties": {
                                  "percent": {
                                      "title": "Percent",
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 100,
                                      "description": "Taux de la remise additionnelle globale."
                                  },
                                  "value": {
                                      "title": "Value",
                                      "type": "integer",
                                      "minimum": 0,
                                      "description": "Montant de la remise additionnelle globale. En millimes, sans séparateurs et sans point décimal."
                                  }
                              },
                              "additionalProperties": false,
                              "description": "Remise additionnelle globale appliquée sur tout le ticket.",
                              "required": [
                                  "percent",
                                  "value"
                              ]
                          }
                      },
                      "additionalProperties": false,
                      "required": [
                          "product",
                          "taxation",
                          "quantity",
                          "discount_per_unit"
                      ]
                  },
                  "minItems": 1,
                  "uniqueItems": false
              },
              "tax_summary": {
                  "title": "Tax summary",
                  "type": "array",
                  "uniqueItems": true,
                  "minItems": 0,
                  "items": {
                      "title": "Tax aggregate",
                      "type": "object",
                      "properties": {
                          "tax_code": {
                              "title": "Tax code",
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 16,
                              "description": "Code de la taxe telle qu'il est indiqué dans le cahier des charges."
                          },
                          "total_amount": {
                              "title": "Total amount",
                              "type": "integer",
                              "minimum": 0,
                              "description": "Montant total de la taxe."
                          }
                      },
                      "additionalProperties": false,
                      "required": [
                          "tax_code",
                          "total_amount"
                      ]
                  }
              },
              "general_discount": {
                  "title": "Discount",
                  "type": "object",
                  "properties": {
                      "percent": {
                          "title": "Percent",
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Taux de la remise additionnelle globale."
                      },
                      "value": {
                          "title": "Value",
                          "type": "integer",
                          "minimum": 0,
                          "description": "Montant de la remise additionnelle globale. En millimes, sans séparateurs et sans point décimal."
                      }
                  },
                  "additionalProperties": false,
                  "description": "Remise additionnelle globale appliquée sur tout le ticket.",
                  "required": [
                      "percent",
                      "value"
                  ]
              },
              "additional_tax": {
                  "title": "Tax",
                  "type": "object",
                  "properties": {
                      "type": {
                          "title": "Type",
                          "type": "string",
                          "enum": [
                              "fixed",
                              "percent"
                          ],
                          "description": "Nature de la taxe appliquée : un pourcentage ou bien une valeur fixe."
                      },
                      "value": {
                          "title": "Value",
                          "type": "number",
                          "minimum": 0.00,
                          "description": "Valeur de la taxe appliquée (Taux ou valeur fixe)."
                      },
                      "tax_code": {
                          "title": "Tax code",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 16,
                          "description": "Code de la taxe telle qu'il est indiqué dans le cahier des charges."
                      }
                  },
                  "additionalProperties": false,
                  "required": [
                      "type",
                      "value",
                      "tax_code"
                  ]
              },
              "payment_details": {
                  "title": "Payment details",
                  "type": "object",
                  "properties": {
                      "collection_details": {
                          "title": "Collection details",
                          "type": "array",
                          "minItems": 1,
                          "uniqueItems": true,
                          "items": {
                              "title": "Payment collection",
                              "type": "object",
                              "properties": {
                                  "method": {
                                      "title": "Method",
                                      "type": "string",
                                      "enum": [
                                          "cash",
                                          "check",
                                          "bank_card",
                                          "restaurant_ticket",
                                          "mobile_payment",
                                          "contre_bon",
                                          "wire_transfer"
                                      ],
                                      "description": "Mode de payement : en espèces (cash), chèque (check), carte bancaire (bank_card), ticket resto. (restaurant_ticket), App. mobile (mobile_payment), contre bon (contre_bon), virement (wire_transfer)."
                                  },
                                  "amount": {
                                      "title": "Amount",
                                      "type": "integer",
                                      "minimum": 1,
                                      "description": "Montant servi par le client."
                                  }
                              },
                              "additionalProperties": false,
                              "required": [
                                  "method",
                                  "amount"
                              ]
                          }
                      },
                      "returned_change": {
                          "title": "Returned change",
                          "type": "array",
                          "uniqueItems": true,
                          "minItems": 0,
                          "items": {
                              "title": "Returned change",
                              "type": "object",
                              "properties": {
                                  "method": {
                                      "title": "Method",
                                      "type": "string",
                                      "enum": [
                                          "cash",
                                          "contre_bon"
                                      ],
                                      "description": "Montant rendu en espèce (cash) ou par contre bon (contre_bon)."
                                  },
                                  "amount": {
                                      "title": "Amount",
                                      "type": "integer",
                                      "minimum": 1,
                                      "description": "Valeur du montant rendu."
                                  }
                              },
                              "additionalProperties": false,
                              "required": [
                                  "method",
                                  "amount"
                              ]
                          }
                      }
                  },
                  "additionalProperties": false,
                  "required": [
                      "collection_details",
                      "returned_change"
                  ]
              },
              "sale_summary": {
                  "title": "Sale summary",
                  "type": "object",
                  "properties": {
                      "total_excl_tax": {
                          "title": "Total excluding tax",
                          "type": "integer",
                          "minimum": 0,
                          "description": "Montant total du ticket en Hors Taxes (HT) après remises appliquées sur les produits."
                      },
                      "total_incl_tax": {
                          "title": "Total including tax",
                          "type": "integer",
                          "minimum": 0,
                          "description": "Montant total du ticket Toutes Taxes Comprises (TTC)."
                      },
                      "total_tax": {
                          "title": "Total tax",
                          "type": "integer",
                          "minimum": 0,
                          "description": "Montant total des taxes appliquées."
                      }
                  },
                  "additionalProperties": false,
                  "required": [
                      "total_excl_tax",
                      "total_incl_tax",
                      "total_tax"
                  ]
              },
              "delivery_details": {
                  "title": "Delivery Details",
                  "type": "object",
                  "properties": {
                      "type": {
                          "title": "Type",
                          "type": "string",
                          "enum": [
                              "SELF_PICKUP",
                              "DELIVERY"
                          ],
                          "description": "Mode de livraison:\n -SELF_PICKUP: Livraison Directe\n -DELIVERY: Livraison par société de livraison."
                      }
                  },
                  "additionalProperties": true,
                  "if": {
                      "properties": {
                          "type": {
                              "title": "Type",
                              "type": "string",
                              "const": "DELIVERY"
                          }
                      }
                  },
                  "then": {
                      "properties": {
                          "carrier_id": {
                              "title": "Carrier ID",
                              "type": "string",
                              "minLength": 8,
                              "maxLength": 8,
                              "pattern": "^\\d{7}[A-Z]$",
                              "description": "Matricule fiscal de la société de livraison.",
                              "format": "regex"
                          }
                      },
                      "required": [
                          "carrier_id"
                      ]
                  }
              }
          },
          "additionalProperties": false,
          "required": [
              "data_type",
              "version",
              "transaction",
              "merchant_identity",
              "customer_identity",
              "sale_details",
              "tax_summary",
              "general_discount",
              "additional_tax",
              "payment_details",
              "sale_summary",
              "delivery_details"
          ]
        }
     }
  },
  "x-webhooks":{
     "newTicket":{
        "post":{
           "summary":"Nacef Ticket schéma",
           "description":"Des illustrations concrètes du schéma ( **Ticket NACEF** ).",
           "operationId":"newTicket",
           "tags":[
              "ticket_schema"
           ],
           "requestBody":{
              "content":{
                 "application/json":{
                    "schema":{
                       "$ref":"#/components/schemas/Ticket"
                    },
                    "examples":{
                       "ticket1":{
                          "summary":"Exemple : Ex1",
                          "value":{
                             "data_type":"ncf.cashier.operation",
                             "version":"1.1.3",
                             "transaction":{
                                "id":"YY12345678",
                                "timestamp":"2023-09-24T14:30:00Z",
                                "operation":{
                                   "op_type":"TICKET",
                                   "context":"SALE"
                                },
                                "originator":{
                                   "agent_identifier":"AGENT001",
                                   "imdf":"12345678901234",
                                   "cash_register_serialnumber":"CR12345678",
                                   "cash_register_software":"POSv2024",
                                   "accreditation_reference":"ACC123456"
                                }
                             },
                             "merchant_identity":{
                                "id":"1234567A",
                                "id_type":"MF",
                                "taxpayer_establishment":{
                                   "commercial_name":"Monoprix",
                                   "reference":"000",
                                   "address":"12 Rue de l'Indépendance",
                                   "city":"Tunis"
                                }
                             },
                             "customer_identity":{
                                "fiscal_advantages":"Lorem",
                                "id_type":"PP",
                                "id":"0000000A"
                             },
                             "sale_details":[
                                {
                                   "product":{
                                      "family_code":"F001",
                                      "name":"Produit A",
                                      "price_pre_tax":5000
                                   },
                                   "taxation":[
                                      {
                                         "type":"percent",
                                         "value":19.0,
                                         "tax_code":"TVA19"
                                      }
                                   ],
                                   "quantity":2,
                                   "discount_per_unit":{
                                      "percent":0,
                                      "value":0
                                   }
                                },
                                {
                                   "product":{
                                      "family_code":"F002",
                                      "name":"Produit B",
                                      "price_pre_tax":3000
                                   },
                                   "taxation":[
                                      {
                                         "type":"percent",
                                         "value":7.0,
                                         "tax_code":"TVA7"
                                      }
                                   ],
                                   "quantity":1,
                                   "discount_per_unit":{
                                      "percent":0,
                                      "value":0
                                   }
                                }
                             ],
                             "tax_summary":[
                                {
                                   "tax_code":"TVA19",
                                   "total_amount":1900
                                },
                                {
                                   "tax_code":"TVA7",
                                   "total_amount":210
                                },
                                {
                                   "tax_code":"TAXE_ADD",
                                   "total_amount":130
                                }
                             ],
                             "general_discount":{
                                "percent":0,
                                "value":0
                             },
                             "additional_tax":{
                                "type":"percent",
                                "value":1.0,
                                "tax_code":"TAXE_ADD"
                             },
                             "payment_details":{
                                "collection_details":[
                                   {
                                      "method":"cash",
                                      "amount":15140
                                   }
                                ],
                                "returned_change":[

                                ]
                             },
                             "sale_summary":{
                                "total_excl_tax":13000,
                                "total_incl_tax":15140,
                                "total_tax":2240
                             },
                             "delivery_details":{
                                "type":"SELF_PICKUP"
                             }
                          }
                       },
                       "ticket2":{
                          "summary":"Exemple : Ex2",
                          "value":{
                             "data_type":"ncf.cashier.operation",
                             "version":"1.1.3",
                             "transaction":{
                                "id":"YYXXXXXX",
                                "timestamp":"2011-06-14T04:12:36.123Z",
                                "operation":{
                                   "op_type":"TICKET",
                                   "context":"SALE"
                                },
                                "originator":{
                                   "agent_identifier":"Lorem",
                                   "imdf":"Lorem ipsum dolo",
                                   "cash_register_serialnumber":"Lorem ipsum",
                                   "cash_register_software":"Lorem ipsum",
                                   "accreditation_reference":"Lorem ipsum"
                                }
                             },
                             "merchant_identity":{
                                "id":"5728291T",
                                "id_type":"MF",
                                "taxpayer_establishment":{
                                   "commercial_name":"Lorem",
                                   "reference":"000",
                                   "address":"Lorem ipsum",
                                   "city":"Lorem"
                                }
                             },
                             "customer_identity":{
                                "fiscal_advantages":"Lorem",
                                "id_type":"NP"
                             },
                             "sale_details":[
                                {
                                   "product":{
                                      "family_code":"Lorem",
                                      "name":"Lorem",
                                      "price_pre_tax":30
                                   },
                                   "taxation":[
                                      {
                                         "type":"fixed",
                                         "value":41,
                                         "tax_code":"Lorem"
                                      }
                                   ],
                                   "quantity":95,
                                   "discount_per_unit":{
                                      "percent":60,
                                      "value":78
                                   }
                                }
                             ],
                             "tax_summary":[
                                {
                                   "tax_code":"Lorem",
                                   "total_amount":2
                                }
                             ],
                             "general_discount":{
                                "percent":58,
                                "value":27
                             },
                             "additional_tax":{
                                "type":"fixed",
                                "value":36,
                                "tax_code":"Lorem"
                             },
                             "payment_details":{
                                "collection_details":[
                                   {
                                      "method":"cash",
                                      "amount":98
                                   }
                                ],
                                "returned_change":[
                                   {
                                      "method":"cash",
                                      "amount":45
                                   }
                                ]
                             },
                             "sale_summary":{
                                "total_excl_tax":20,
                                "total_incl_tax":43,
                                "total_tax":31
                             },
                             "delivery_details":{
                                "type":"DELIVERY",
                                "carrier_id":"0000000A"
                             }
                          }
                       }
                    }
                 }
              }
           }
        }
     }
  }
}
