Skip to content

Commit f63099c

Browse files
authored
Merge pull request #45 from invopop/non-eu-customer-id-type
Route non-EU customer tax IDs to IDType=04
2 parents f7ecae0 + 87f05e2 commit f63099c

3 files changed

Lines changed: 21 additions & 11 deletions

File tree

convert/doc_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ func TestInvoiceConversion(t *testing.T) {
8181
invoice, _ := convert.NewTicketBAI(goblInvoice, ts, role, convert.ZoneBI)
8282

8383
assert.Equal(t, "GB", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.CodigoPais)
84-
assert.Equal(t, "GBPP-123456-S", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.ID)
85-
assert.Equal(t, "02", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.IDType)
84+
assert.Equal(t, "PP-123456-S", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.ID)
85+
assert.Equal(t, "04", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.IDType)
8686
assert.Equal(t, "Abroad Co LLC", invoice.Sujetos.Destinatarios.IDDestinatario[0].ApellidosNombreRazonSocial)
8787
})
8888

convert/parties.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
)
1010

1111
const (
12-
idTypeCodeTaxID = "02"
12+
idTypeCodeNIFVAT = "02"
13+
idTypeCodeForeign = "04"
1314
)
1415

1516
var idTypeCodeMap = map[cbc.Key]string{
@@ -92,11 +93,13 @@ func otherIdentity(party *org.Party) *IDOtro {
9293
}
9394

9495
if party.TaxID != nil && party.TaxID.Code != "" {
95-
oid.IDType = idTypeCodeTaxID
96-
country := party.TaxID.Country.String()
96+
oid.IDType = taxIDType(party.TaxID.Country)
9797
id := party.TaxID.Code.String()
98-
if !strings.HasPrefix(id, country) {
99-
id = country + id
98+
if oid.IDType == idTypeCodeNIFVAT {
99+
country := party.TaxID.Country.String()
100+
if !strings.HasPrefix(id, country) {
101+
id = country + id
102+
}
100103
}
101104
oid.ID = id
102105
return oid
@@ -122,6 +125,13 @@ func otherIdentity(party *org.Party) *IDOtro {
122125
return nil
123126
}
124127

128+
func taxIDType(country l10n.TaxCountryCode) string {
129+
if l10n.Union(l10n.EU).HasMember(country.Code()) {
130+
return idTypeCodeNIFVAT
131+
}
132+
return idTypeCodeForeign
133+
}
134+
125135
func partyCountry(party *org.Party) l10n.TaxCountryCode {
126136
if party == nil {
127137
return ""

test/data/out/sample-invoice-export.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<IDDestinatario>
1313
<IDOtro>
1414
<CodigoPais>MX</CodigoPais>
15-
<IDType>02</IDType>
16-
<ID>MXEKU9003173C9</ID>
15+
<IDType>04</IDType>
16+
<ID>EKU9003173C9</ID>
1717
</IDOtro>
1818
<ApellidosNombreRazonSocial>ESCUELA KEMPER URGATE</ApellidosNombreRazonSocial>
1919
<CodigoPostal>42501</CodigoPostal>
@@ -124,7 +124,7 @@
124124
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
125125
</ds:Transforms>
126126
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"></ds:DigestMethod>
127-
<ds:DigestValue>vFBd12HPbcqLrQlQbmKYaaZI39qLGQcEMrh9Q4Yie2nU25t5FHUSAmXlzYCM3bpTvniAtbz15d4IUinjVQkYyg==</ds:DigestValue>
127+
<ds:DigestValue>DFIIyjxbGVd7hVWp0aMdGrkKYkXqZf/8uhADvTx9htmQMeM9OnM+j1KewkiQoFH9P5Pd6oO8DKATMRupqd3SJg==</ds:DigestValue>
128128
</ds:Reference>
129129
<ds:Reference URI="#Certificate-0192fbd4-5087-708c-9b31-e8f653ef0c52">
130130
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"></ds:DigestMethod>
@@ -138,7 +138,7 @@
138138
<ds:DigestValue>8fElKl+lSKw9IwiFbOdjeIfLBvGm0ccwPVngicZsNuYF4F8bqCEtu4sjfa44joYuTZXJeI+0vflB3H8aYGbYgA==</ds:DigestValue>
139139
</ds:Reference>
140140
</ds:SignedInfo>
141-
<ds:SignatureValue Id="Signature-0192fbd4-5087-708c-9b31-e8f653ef0c52-SignatureValue">Az7yoUisIWOeMJhTOvY5ebwAqlWnI8WdPhkzsw28U22WL74hhE5k8DpI1+/0L1JHs98zhipnjb00wl2gQxGUB/Fy0zjkvjr1ejJF7s5ChNtqsdsV+gxICXpooFWpw4rTRiKCwot7P3pgVrJLVw1SLyhY03UcSxGxgCi2vZhYml6MyP6+tDOu7JJW9Jz2ZlKSsIrArKXJd6b40NVs1tugmf17GOf9SNieVuLxiaQWgFywShHwDgA6Og48EExJ6073CtmmIHFRs1t0As0qh4lLlozrZRwWyIZFN1wcYwkdoIS90lZLGPQ/Z/ChqpRB+8DrKDp7q0BKa48Jw2NSU0kROw==</ds:SignatureValue>
141+
<ds:SignatureValue Id="Signature-0192fbd4-5087-708c-9b31-e8f653ef0c52-SignatureValue">jy8ud5wPeBVFLNRrhJjBzSFAbFTiMmqs2Bo2cU5Ext0TAJZ+jF1TMiwT6Kdk4lQwUkMQP744KX7n+oNsMxPiY+8Noe+Y4Mc3N8u5Z30nSmUR6WzzDhmdxe276W9pCoymD5dEftGHaPuSqB+gZ76CfSgEfo6DzpG3UVkUtpcRTKn0nU4msuJ1dgNdJwXt5wNmcMSufqQWZ9pcJK8/YA3JoAjcuQyD3tB8BBsgzaDcFEFcFSGfgv4S2pTc2+NUlc8A2G5goCFEHuTb9kWSR8MC1TPiNbBazoiw8LU4RMV+mcV4uSf3JL6SSsrjROC5DJ+d+UX7allAeDB1T3hlFRB07w==</ds:SignatureValue>
142142
<ds:KeyInfo Id="Certificate-0192fbd4-5087-708c-9b31-e8f653ef0c52">
143143
<ds:X509Data>
144144
<ds:X509Certificate>MIIJtzCCB5+gAwIBAgICJ4swDQYJKoZIhvcNAQELBQAwgZcxCzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjE6MDgGA1UECwwxTlpaIFppdXJ0YWdpcmkgcHVibGlrb2EgLSBDZXJ0aWZpY2FkbyBwdWJsaWNvIFNDSTE2MDQGA1UEAwwtQ0EgZGUgQ2l1ZGFkYW5vcyB5IEVudGlkYWRlcyAoNCkgLSBERVNBUlJPTExPMB4XDTI1MDEyMjE0MjA1OVoXDTI5MDEyMjE0MjA1OVowggFtMQswCQYDVQQGEwJFUzFvMG0GA1UEDQxmUmVnOkdhc3RlaXogL0hvamE6Qi0xNjY0NzIgL1RvbW86MzczOTMgL1NlY2Npb246OCAvTGlicm86MSAvRm9saW86MjAgL0ZlY2hhOjEwLTAyLTE5NzQgL0luc2NyaXBjacOzbjoxMRgwFgYDVQRhDA9WQVRFUy1TNzgzNjEwN0gxPTA7BgNVBAsMNE9yZGV6a2FyaSB6aXVydGFnaXJpYSAtIENlcnRpZmljYWRvIGRlIHJlcHJlc2VudGFudGUxFDASBgNVBAoMC0laRU5QRSBTLkEuMRIwEAYDVQQFEwk5OTk5OTk3M0sxGDAWBgNVBAQMD0ZJQ1RJQ0lPIEFDVElWTzEWMBQGA1UEKgwNUkVQUkVTRU5UQU5URTE4MDYGA1UEAwwvOTk5OTk5NzNLIFJFUFJFU0VOVEFOVEUgRklDVElDSU8gKFI6IFM3ODM2MTA3SCkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnd2UlkzcBw5nGaSIOEq02rd65u94gg+zU6PYJ4dpgGMjIxf7bW3jFL/WJPmXetwGNz9HeDAFBnNhZgk+tOVOi/19nXmpOez8cFKWo1ZI3RCGyGuCwdXmUgatsAS1LoQzJ9JF5QWvE4JbYohsdvBHac+PL09nN27hZJkI8vNpu4YPVfZUGntGhArbaionMo2XynJ6gZjGJjZKOe/P4UvJJBdHGJ8nPPH4IWS8p2TsuitzRRzR0347Ymr5Wkwx3fAHb5VDKXwD3QKyd8TYvD9WQt5+wfcLqlED4J4uN5YZ5c75j+p5VglbBAqz6o7/8EOP7rgO1zKk6Lva3d1hTAC3jAgMBAAGjggQyMIIELjCBxwYDVR0SBIG/MIG8hhVodHRwOi8vd3d3Lml6ZW5wZS5jb22BD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAxMCBWaXRvcmlhLUdhc3RlaXowDgYDVR0PAQH/BAQDAgXgMB8GA1UdJQQYMBYGCCsGAQUFBwMCBgorBgEEAYI3CgMMMB0GA1UdDgQWBBSGc4Y4snKOOnJlQ/HgfuPI/aOHIjAfBgNVHSMEGDAWgBRv//0N8gxjDyZxXRrgb2VkZjhrkzCCATQGA1UdIASCASswggEnMIIBDQYJKwYBBAHzOWYMMIH/MCUGCCsGAQUFBwIBFhlodHRwOi8vd3d3Lml6ZW5wZS5jb20vY3BzMIHVBggrBgEFBQcCAjCByAyBxUtvbnRzdWx0YSB3d3cuaXplbnBlLmNvbS1lbiBiYWxkaW50emFrIGV0YSBrb25kaXppb2FrIHppdXJ0YWdpcmlhbiBmaWRhdHUgZWRvIGVyYWJpbGkgYXVycmV0aWsgLSBDb25zdWx0ZSBlbiB3d3cuaXplbnBlLmNvbSBsb3MgdMOpcm1pbm9zIHkgY29uZGljaW9uZXMgYW50ZXMgZGUgdXRpbGl6YXIgbyBjb25maWFyIGVuIGVsIGNlcnRpZmljYWRvMAkGBwQAi+xAAQIwCQYHYIVUAQMFCDCBogYIKwYBBQUHAQEEgZUwgZIwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwZGVzLml6ZW5wZS5jb20waQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cuaXplbnBlLmNvbS9jb250ZW5pZG9zL2luZm9ybWFjaW9uL2Nhc19pemVucGUvZXNfY2FzL2FkanVudG9zL0NDRUVSX2NlcnRfc2hhMjU2LmNydDCB2wYIKwYBBQUHAQMEgc4wgcswCAYGBACORgEBMAgGBgQAjkYBBDALBgYEAI5GAQMCAQ8wfAYGBACORgEFMHIwJBYeaHR0cHM6Ly93d3cuaXplbnBlLmNvbS9wZHMvZW4vEwJlbjAkFh5odHRwczovL3d3dy5pemVucGUuY29tL3Bkcy9ldS8TAmV1MCQWHmh0dHBzOi8vd3d3Lml6ZW5wZS5jb20vcGRzL2VzLxMCZXMwEwYGBACORgEGMAkGBwQAjkYBBgEwFQYIKwYBBQUHCwIwCQYHBACL7EkBAjA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsZGVzLml6ZW5wZS5jb20vY2dpLWJpbi9jcmwyMA0GCSqGSIb3DQEBCwUAA4ICAQCBkGre0XKtJ6DsKSFFXok7soIIRJ8XcBmAwPpqgi7apLaIgM8iknRwISxsbgIvmeYf42yHBzUt6UH/dFwa3K67IaVwd2xYpOlGAcd9GXY0PHL1e9Bv1CuRw8CtvnZRjNyga9JglZJvojveKyK79gCWLagz/Zz/d++t343dEGYGPetRExPzZKDaKn40jlbL+TANMgay/Gu+gLatDtmV8PDz69e/zpyM7jnOa8CHKagM/jnEmggIuJkzYmlHpCyznw0Cbb60y4y2jZgSSNBmIkUbtpOdOuUvy8uzWoovkyptz2TCFmBx9nylHP2zykrKmS4VSGSEn2a8B6IMKUA2SIHRVaAGSMtN7dV9PrWu4YnklJyX46HR3TlhGCynTyvFfCf3JKCwlagnzGqRlVUKQI6sZMHdMIRuwduqVUn996tmeJaz257iV7UTN6rkrBnp0PegtkVRFXQAR/3o1ldSZlzr8RpPccvUwtvILz5Squh/CoCPGQLBSXzPm59q1N8m7yb+hJUl3ovsXzZKmos1MeHoqQ1MBE3Zr56dh+mTNBNEJMs2CrO1pbbSAFdRf63PXoY7cek2Cy0Y7qPCeaLGzyeHa9AMfeA2Fj5dgPNtLz6050r9xAhnVgkZ7J7NDMCCZUVZcnInRh0l+wHoCMtT0nnfl7rlnuPsh4wjTQgAcOoGHA==</ds:X509Certificate>

0 commit comments

Comments
 (0)