<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.solucionfactible.com/cfd/comprobante" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.solucionfactible.com/cfd/comprobante" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="ComprobanteFiscalDigital">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="Cancelacion" minOccurs="0">
                    <xs:complexType mixed="true">
                        <xs:attribute name="motivo" use="optional">
                            <xs:annotation>
                                <xs:documentation></xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="folioSustituye" use="optional">
                            <xs:annotation>
                                <xs:documentation></xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="serieSustituye" use="optional">
                            <xs:annotation>
                                <xs:documentation></xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="uuidSustituye" use="optional">
                            <xs:annotation>
                                <xs:documentation></xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="textoMotivo" use="optional">
                            <xs:annotation>
                                <xs:documentation></xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Divisa" minOccurs="0">
                    <xs:complexType mixed="true">
                        <xs:attribute name="codigoISO" use="optional">
                            <xs:annotation>
                                <xs:documentation>Atributo requerido para expresar el código ISO de la divisa.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:length value="3"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="nombre" use="required">
                            <xs:annotation>
                                <xs:documentation>Atributo requerido para expresar el nombre de la divisa.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="3"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="tipoDeCambio" use="required" type="xs:decimal">
                            <xs:annotation>
                                <xs:documentation>Atributo requerido para tipo de cambio de la divisa con respecto la
                                    moneda nacional.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Cliente" minOccurs="0" maxOccurs="1">
                    <xs:complexType mixed="true">
                        <xs:sequence>
                            <xs:element name="Embarque" minOccurs="0" maxOccurs="1">
                                <xs:complexType mixed="true">
                                    <xs:sequence>
                                        <xs:element name="Direccion" type="Ubicacion" minOccurs="0" maxOccurs="1">
                                            <xs:annotation>
                                                <xs:documentation>Nodo opcional para la definición de la ubicación de la
                                                    dirección de embarque.
                                                </xs:documentation>
                                            </xs:annotation>
                                        </xs:element>
                                    </xs:sequence>
                                    <xs:attribute name="rfc" use="optional">
                                        <xs:annotation>
                                            <xs:documentation>Atributo opcional para indicar el RFC al que se embarcará
                                                la mercancía.
                                            </xs:documentation>
                                        </xs:annotation>
                                        <xs:simpleType>
                                            <xs:restriction base="RFC">
                                                <xs:whiteSpace value="collapse"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:attribute>
                                    <xs:attribute name="nombre" use="optional" type="xs:string">
                                        <xs:annotation>
                                            <xs:documentation>Atributo opcional para indicar el nombre o razón social al
                                                que se embarcará la mercancía.
                                            </xs:documentation>
                                        </xs:annotation>
                                    </xs:attribute>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="email" use="optional">
                            <xs:annotation>
                                <xs:documentation>Atributo requerido para registrar el correo electrónico del cliente.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="Email">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="CamposPersonalizados" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="CampoPersonalizado" maxOccurs="unbounded">
                                <xs:complexType mixed="true">
                                    <xs:attribute name="nombre" use="required">
                                        <xs:annotation>
                                            <xs:documentation>Atributo requerido para especificar el nombre del campo
                                                personalizado.
                                            </xs:documentation>
                                        </xs:annotation>
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:minLength value="1"/>
                                                <xs:whiteSpace value="collapse"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:attribute>
                                    <xs:attribute name="valor" use="optional" type="xs:string">
                                        <xs:annotation>
                                            <xs:documentation>Atributo requerido para especificar el valor del campo
                                                personalizado.
                                            </xs:documentation>
                                        </xs:annotation>
                                    </xs:attribute>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="AddendaAdicional" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Nodo opcional para incluir addendas adicionales.</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any minOccurs="0" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="DireccionNotifica" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Nodo opcional para agregar direcciones de correo electrónico a donde se debe
                            notificar la creación exitosa del comprobante.
                        </xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="email" use="required">
                            <xs:annotation>
                                <xs:documentation>Atributo requerido para especificar la dirección de correo a donde
                                    debe enviarse la notificación.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:simpleType>
                                <xs:restriction base="Email">
                                    <xs:whiteSpace value="collapse"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="notas" use="optional" type="xs:string"/>
            <xs:attribute name="estatus" use="optional">
                <xs:annotation>
                    <xs:documentation>Atributo opcional para indicar si el comprobante está vigente o cancelado.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:whiteSpace value="collapse"/>
                        <xs:enumeration value="vigente">
                            <xs:annotation>
                                <xs:documentation>Vigente</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="cancelado">
                            <xs:annotation>
                                <xs:documentation>Cancelado</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="Ubicacion">
        <xs:annotation>
            <xs:documentation>Tipo definido para expresar domicilios o direcciones</xs:documentation>
        </xs:annotation>
        <xs:attribute name="calle" use="optional">
            <xs:annotation>
                <xs:documentation>Este atributo opcional sirve para precisar la avenida, calle, camino o carretera donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="noExterior" use="optional">
            <xs:annotation>
                <xs:documentation>Este atributo opcional sirve para expresar el número particular en donde se da la ubicación sobre una calle dada.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="noInterior" use="optional">
            <xs:annotation>
                <xs:documentation>Este atributo opcional sirve para expresar información adicional para especificar la ubicación cuando calle y número exterior (noExterior) no resulten suficientes para determinar la ubicación de forma precisa.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="colonia" use="optional">
            <xs:annotation>
                <xs:documentation>Este atributo opcional sirve para precisar la colonia en donde se da la ubicación cuando se desea ser más específico en casos de ubicaciones urbanas.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="localidad" use="optional">
            <xs:annotation>
                <xs:documentation>Atributo opcional que sirve para precisar la ciudad o población donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="referencia" use="optional">
            <xs:annotation>
                <xs:documentation>Atributo opcional para expresar una referencia de ubicación adicional.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="municipio" use="optional">
            <xs:annotation>
                <xs:documentation>Atributo opcional que sirve para precisar el municipio o delegación (en el caso del Distrito Federal) en donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="estado" use="optional">
            <xs:annotation>
                <xs:documentation>Atributo opcional que sirve para precisar el estado o entidad federativa donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="pais" use="required">
            <xs:annotation>
                <xs:documentation>Atributo requerido que sirve para precisar el país donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="codigoPostal" use="optional">
            <xs:annotation>
                <xs:documentation>Atributo opcional que sirve para asentar el código postal en donde se da la ubicación.</xs:documentation>
            </xs:annotation>
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:whiteSpace value="collapse"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:simpleType name="Email">
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Za-z0-9_]+([-+.'][A-Za-z0-9_]+)*@[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*\.[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="RFC">
        <xs:annotation>
            <xs:documentation>Tipo definido para expresar claves del Registro Federal de Contribuyentes</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:minLength value="12"/>
            <xs:maxLength value="13"/>
            <xs:pattern value="[A-Z&amp;Ñ]{3,4}[0-9]{6}[A-Z0-9]{3}"/>
            <xs:whiteSpace value="collapse"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
