giansalex/greenter

View on GitHub
packages/xml/src/Xml/Templates/despatch2022.xml.twig

Summary

Maintainability
Test Coverage
{% apply spaceless %}
<?xml version="1.0" encoding="utf-8"?>
<DespatchAdvice xmlns="urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
    <ext:UBLExtensions>
        <ext:UBLExtension>
            <ext:ExtensionContent/>
        </ext:UBLExtension>
    </ext:UBLExtensions>
    <cbc:UBLVersionID>2.1</cbc:UBLVersionID>
    <cbc:CustomizationID>2.0</cbc:CustomizationID>
    <cbc:ID>{{ doc.serie }}-{{ doc.correlativo }}</cbc:ID>
    <cbc:IssueDate>{{ doc.fechaEmision|date('Y-m-d') }}</cbc:IssueDate>
    <cbc:IssueTime>{{ doc.fechaEmision|date('H:i:s') }}</cbc:IssueTime>
    <cbc:DespatchAdviceTypeCode listAgencyName="PE:SUNAT" listName="Tipo de Documento" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo01">{{ doc.tipoDoc }}</cbc:DespatchAdviceTypeCode>
    {% if doc.observacion %}
    <cbc:Note><![CDATA[{{ doc.observacion|raw }}]]></cbc:Note>
    {% endif %}
    {% for rel in doc.addDocs  %}
    <cac:AdditionalDocumentReference>
        <cbc:ID>{{ rel.nro }}</cbc:ID>
        <cbc:DocumentTypeCode listAgencyName="PE:SUNAT" listName="Documento relacionado al transporte" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo61">{{ rel.tipo }}</cbc:DocumentTypeCode>
        <cbc:DocumentType>{{ rel.tipoDesc }}</cbc:DocumentType>
        {% if rel.emisor %}
        <cac:IssuerParty>
            <cac:PartyIdentification>
                <cbc:ID schemeID="6" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ rel.emisor }}</cbc:ID>
            </cac:PartyIdentification>
        </cac:IssuerParty>
        {% endif %}
    </cac:AdditionalDocumentReference>
    {% endfor %}
    {% set emp = doc.company %}
    <cac:Signature>
        <cbc:ID>{{ emp.ruc }}</cbc:ID>
        <cac:SignatoryParty>
            <cac:PartyIdentification>
                <cbc:ID>{{ emp.ruc }}</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyName>
                <cbc:Name><![CDATA[{{ emp.razonSocial|raw }}]]></cbc:Name>
            </cac:PartyName>
        </cac:SignatoryParty>
        <cac:DigitalSignatureAttachment>
            <cac:ExternalReference>
                <cbc:URI>#GREENTER-SIGN</cbc:URI>
            </cac:ExternalReference>
        </cac:DigitalSignatureAttachment>
    </cac:Signature>
    <cac:DespatchSupplierParty>
        <cac:Party>
            <cac:PartyIdentification>
                <cbc:ID schemeID="6" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ emp.ruc }}</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName><![CDATA[{{ emp.razonSocial|raw }}]]></cbc:RegistrationName>
            </cac:PartyLegalEntity>
        </cac:Party>
    </cac:DespatchSupplierParty>
    <cac:DeliveryCustomerParty>
        <cac:Party>
            <cac:PartyIdentification>
                <cbc:ID schemeID="{{ doc.destinatario.tipoDoc }}" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ doc.destinatario.numDoc }}</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName><![CDATA[{{ doc.destinatario.rznSocial|raw }}]]></cbc:RegistrationName>
            </cac:PartyLegalEntity>
        </cac:Party>
    </cac:DeliveryCustomerParty>
    {% if doc.comprador %}
    <cac:BuyerCustomerParty>
        <cac:Party>
            <cac:PartyIdentification>
                <cbc:ID schemeID="{{ doc.comprador.tipoDoc }}" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ doc.comprador.numDoc }}</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName><![CDATA[{{ doc.comprador.rznSocial|raw }}]]></cbc:RegistrationName>
            </cac:PartyLegalEntity>
        </cac:Party>
    </cac:BuyerCustomerParty>
    {% endif %}
    {% if doc.tercero %}
    <cac:SellerSupplierParty>
        <cac:Party>
            <cac:PartyIdentification>
                <cbc:ID schemeID="{{ doc.tercero.tipoDoc }}" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ doc.tercero.numDoc }}</cbc:ID>
            </cac:PartyIdentification>
            <cac:PartyLegalEntity>
                <cbc:RegistrationName><![CDATA[{{ doc.tercero.rznSocial|raw }}]]></cbc:RegistrationName>
            </cac:PartyLegalEntity>
        </cac:Party>
    </cac:SellerSupplierParty>
    {% endif %}
    {% set envio = doc.envio %}
    <cac:Shipment>
        <cbc:ID>SUNAT_Envio</cbc:ID>
        <cbc:HandlingCode listAgencyName="PE:SUNAT" listName="Motivo de traslado" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo20">{{ envio.codTraslado }}</cbc:HandlingCode>
        {% if envio.desTraslado %}
        <cbc:HandlingInstructions>{{ envio.desTraslado }}</cbc:HandlingInstructions>
        {% endif %}
        {% if envio.sustentoPeso %}
        <cbc:Information>{{ envio.sustentoPeso }}</cbc:Information>
        {% endif %}
        <cbc:GrossWeightMeasure unitCode="{{ envio.undPesoTotal }}">{{ envio.pesoTotal|n_format(3) }}</cbc:GrossWeightMeasure>
        {% if envio.pesoItems %}
        <cbc:NetWeightMeasure unitCode="KGM">{{ envio.pesoItems|n_format(3) }}</cbc:NetWeightMeasure>
        {% endif %}
        {% if envio.numBultos %}
        <cbc:TotalTransportHandlingUnitQuantity>{{ envio.numBultos }}</cbc:TotalTransportHandlingUnitQuantity>
        {% endif %}
        {% for indicador in envio.indicadores %}
        <cbc:SpecialInstructions>{{ indicador }}</cbc:SpecialInstructions>
        {% endfor %}
        <cac:ShipmentStage>
            <cbc:TransportModeCode listName="Modalidad de traslado" listAgencyName="PE:SUNAT" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo18">{{ envio.modTraslado }}</cbc:TransportModeCode>
            {% if envio.fecTraslado %}
            <cac:TransitPeriod>
                <cbc:StartDate>{{ envio.fecTraslado|date('Y-m-d') }}</cbc:StartDate>
            </cac:TransitPeriod>
            {% endif %}
            {% if envio.transportista %}
            <cac:CarrierParty>
                <cac:PartyIdentification>
                    <cbc:ID schemeID="{{ envio.transportista.tipoDoc }}">{{ envio.transportista.numDoc }}</cbc:ID>
                </cac:PartyIdentification>
                <cac:PartyLegalEntity>
                    <cbc:RegistrationName><![CDATA[{{ envio.transportista.rznSocial|raw }}]]></cbc:RegistrationName>
                    <cbc:CompanyID>{{ envio.transportista.nroMtc }}</cbc:CompanyID>
                </cac:PartyLegalEntity>
            </cac:CarrierParty>
            {% endif %}
            {% for chofer in envio.choferes %}
            <cac:DriverPerson>
                <cbc:ID schemeID="{{ chofer.tipoDoc }}" schemeName="Documento de Identidad" schemeAgencyName="PE:SUNAT" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo06">{{ chofer.nroDoc }}</cbc:ID>
                <cbc:FirstName>{{ chofer.nombres }}</cbc:FirstName>
                <cbc:FamilyName>{{ chofer.apellidos }}</cbc:FamilyName>
                <cbc:JobTitle>{{ chofer.tipo }}</cbc:JobTitle>
                <cac:IdentityDocumentReference>
                    <cbc:ID>{{ chofer.licencia }}</cbc:ID>
                </cac:IdentityDocumentReference>
            </cac:DriverPerson>
            {% endfor %}
        </cac:ShipmentStage>
        <cac:Delivery>
            <cac:DeliveryAddress>
                <cbc:ID schemeAgencyName="PE:INEI" schemeName="Ubigeos">{{ envio.llegada.ubigueo }}</cbc:ID>
                {% if envio.llegada.codLocal %}
                <cbc:AddressTypeCode listID="{{ envio.llegada.ruc }}">{{ envio.llegada.codLocal }}</cbc:AddressTypeCode>
                {% endif %}
                <cac:AddressLine>
                    <cbc:Line>{{ envio.llegada.direccion }}</cbc:Line>
                </cac:AddressLine>
            </cac:DeliveryAddress>
            <cac:Despatch>
                <cac:DespatchAddress>
                    <cbc:ID schemeAgencyName="PE:INEI" schemeName="Ubigeos">{{ envio.partida.ubigueo }}</cbc:ID>
                    {% if envio.partida.codLocal %}
                    <cbc:AddressTypeCode listID="{{ envio.partida.ruc }}">{{ envio.partida.codLocal }}</cbc:AddressTypeCode>
                    {% endif %}
                    <cac:AddressLine>
                        <cbc:Line>{{ envio.partida.direccion }}</cbc:Line>
                    </cac:AddressLine>
                </cac:DespatchAddress>
            </cac:Despatch>
        </cac:Delivery>
        {% for precinto in envio.contenedores %}
        <cac:TransportHandlingUnit>
            <cac:Package>
                <cbc:ID>{{ loop.index }}</cbc:ID>
                <cbc:TraceID>{{ precinto }}</cbc:TraceID>
            </cac:Package>
        </cac:TransportHandlingUnit>
        {% endfor %}
        {% if envio.vehiculo %}
        <cac:TransportHandlingUnit>
            <cac:TransportEquipment>
                <cbc:ID>{{ envio.vehiculo.placa }}</cbc:ID>
                {% if envio.vehiculo.nroCirculacion %}
                <cac:ApplicableTransportMeans>
                    <cbc:RegistrationNationalityID>{{ envio.vehiculo.nroCirculacion }}</cbc:RegistrationNationalityID>
                </cac:ApplicableTransportMeans>
                {% endif %}
                {% for sec in envio.vehiculo.secundarios %}
                <cac:AttachedTransportEquipment>
                    <cbc:ID>{{ sec.placa }}</cbc:ID>
                    {% if sec.nroCirculacion %}
                    <cac:ApplicableTransportMeans>
                        <cbc:RegistrationNationalityID>{{ sec.nroCirculacion }}</cbc:RegistrationNationalityID>
                    </cac:ApplicableTransportMeans>
                    {% endif %}
                    {% if sec.nroAutorizacion %}
                    <cac:ShipmentDocumentReference>
                        <cbc:ID schemeID="{{ sec.codEmisor }}" schemeName="Entidad Autorizadora" schemeAgencyName="PE:SUNAT">{{ sec.nroAutorizacion }}</cbc:ID>
                    </cac:ShipmentDocumentReference>
                    {% endif %}
                </cac:AttachedTransportEquipment>
                {% endfor %}
                {% if envio.vehiculo.nroAutorizacion %}
                <cac:ShipmentDocumentReference>
                    <cbc:ID schemeID="{{ envio.vehiculo.codEmisor }}" schemeName="Entidad Autorizadora" schemeAgencyName="PE:SUNAT">{{ envio.vehiculo.nroAutorizacion }}</cbc:ID>
                </cac:ShipmentDocumentReference>
                {% endif %}
            </cac:TransportEquipment>
        </cac:TransportHandlingUnit>
        {% endif %}
        {% if envio.puerto %}
        <cac:FirstArrivalPortLocation>
            <cbc:ID schemeAgencyName="PE:SUNAT" schemeName="Puertos" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo63">{{ envio.puerto.codigo }}</cbc:ID>
            <cbc:LocationTypeCode>1</cbc:LocationTypeCode>
            <cbc:Name>{{ envio.puerto.nombre }}</cbc:Name>
        </cac:FirstArrivalPortLocation>
        {% elseif envio.aeropuerto %}
        <cac:FirstArrivalPortLocation>
            <cbc:ID schemeAgencyName="PE:SUNAT" schemeName="Aeropuertos" schemeURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo64">{{ envio.aeropuerto.codigo }}</cbc:ID>
            <cbc:LocationTypeCode>2</cbc:LocationTypeCode>
            <cbc:Name>{{ envio.aeropuerto.nombre }}</cbc:Name>
        </cac:FirstArrivalPortLocation>
        {% endif %}
    </cac:Shipment>
    {% for det in doc.details %}
    <cac:DespatchLine>
        <cbc:ID>{{ loop.index }}</cbc:ID>
        <cbc:DeliveredQuantity unitCode="{{ det.unidad }}">{{ det.cantidad|n_format_limit(10) }}</cbc:DeliveredQuantity>
        <cac:OrderLineReference>
            <cbc:LineID>{{ loop.index }}</cbc:LineID>
        </cac:OrderLineReference>
        <cac:Item>
            <cbc:Description><![CDATA[{{ det.descripcion|raw }}]]></cbc:Description>
            <cac:SellersItemIdentification>
                <cbc:ID>{{ det.codigo }}</cbc:ID>
            </cac:SellersItemIdentification>
            {% if det.codProdSunat %}
            <cac:CommodityClassification>
                <cbc:ItemClassificationCode listID="UNSPSC" listAgencyName="GS1 US" listName="Item Classification">{{ det.codProdSunat }}</cbc:ItemClassificationCode>
            </cac:CommodityClassification>
            {% endif %}
            {% for atr in det.atributos %}
            <cac:AdditionalItemProperty >
                <cbc:Name>{{ atr.name }}</cbc:Name>
                <cbc:NameCode>{{ atr.code }}</cbc:NameCode>
                {% if atr.value %}
                    <cbc:Value>{{ atr.value }}</cbc:Value>
                {% endif %}
            </cac:AdditionalItemProperty>
            {% endfor %}
        </cac:Item>
    </cac:DespatchLine>
    {% endfor %}
</DespatchAdvice>
{% endapply %}