From fdddfaf172c4e644ea663cb00fcac747c6758ba3 Mon Sep 17 00:00:00 2001 From: Sam Lown Date: Wed, 25 Sep 2024 21:39:00 +0000 Subject: [PATCH] Upgrading to use GOBL v0.200 --- address.go | 13 ++-- corrective.go | 36 +++++----- go.mod | 23 ++++--- go.sum | 101 +++++++++++++--------------- invoices.go | 16 ++--- items.go | 2 +- payments.go | 2 +- tax_id.go | 12 ++-- test/data/credit-note.json | 15 ++++- test/data/credit-note.yaml | 1 + test/data/invoice-vat-irpf-inc.json | 16 +++-- test/data/invoice-vat-irpf-inc.yaml | 1 + test/data/invoice-vat-irpf.json | 13 +++- test/data/invoice-vat-irpf.yaml | 1 + test/data/invoice-vat-provider.json | 13 +++- test/data/invoice-vat-provider.yaml | 1 + test/data/invoice-vat.json | 13 +++- test/data/invoice-vat.yaml | 1 + 18 files changed, 164 insertions(+), 116 deletions(-) diff --git a/address.go b/address.go index fd5163c..de3045c 100644 --- a/address.go +++ b/address.go @@ -44,14 +44,13 @@ func addressMaybe(element string) string { return "" } -// ES is the ISO 3166-1 alfa-3 code for Spain +// ES is the ISO Alpha-3 code used for Spain const ES string = "ESP" -func countryCode(country l10n.CountryCode) string { - switch country { - case l10n.ES: - return ES // FIXME: [JUANJO] add all the countries in the world? +func countryCode(country l10n.ISOCountryCode) string { + cd := l10n.Countries().Code(country.Code()) + if cd == nil { + return "" } - - return "" + return cd.Alpha3 } diff --git a/corrective.go b/corrective.go index 41c364d..0649b4d 100644 --- a/corrective.go +++ b/corrective.go @@ -1,11 +1,12 @@ package facturae import ( + "github.com/invopop/gobl/addons/es/facturae" "github.com/invopop/gobl/bill" "github.com/invopop/gobl/cal" "github.com/invopop/gobl/cbc" "github.com/invopop/gobl/i18n" - "github.com/invopop/gobl/regimes/es" + "github.com/invopop/gobl/tax" ) // Corrective is used to represent the details of a previous invoice that @@ -31,10 +32,10 @@ var methodDefs = &cbc.KeyDefinition{ i18n.EN: "Correction Method", i18n.ES: "Método de rectificación", }, - Codes: []*cbc.CodeDefinition{ + Values: []*cbc.ValueDefinition{ { // Corrective - Code: cbc.Code("01"), + Value: "01", Name: i18n.String{ i18n.EN: "Full items", i18n.ES: "Rectificación íntegra", @@ -42,7 +43,7 @@ var methodDefs = &cbc.KeyDefinition{ }, { // Credit or Debit notes - Code: cbc.Code("02"), + Value: "02", Name: i18n.String{ i18n.EN: "Corrected items only", i18n.ES: "Rectificación por diferencias", @@ -50,7 +51,7 @@ var methodDefs = &cbc.KeyDefinition{ }, { // Unused - Code: cbc.Code("03"), + Value: "03", Name: i18n.String{ i18n.EN: "Bulk deal", i18n.ES: "Rectificación por descuento por volumen de operaciones durante un periodo", @@ -58,7 +59,7 @@ var methodDefs = &cbc.KeyDefinition{ }, { // Unused - Code: cbc.Code("04"), + Value: "04", Name: i18n.String{ i18n.EN: "Authorized by the Tax Agency", i18n.ES: "Autorizadas por la Agencia Tributaria", @@ -70,8 +71,8 @@ var methodDefs = &cbc.KeyDefinition{ func newCorrective(inv *bill.Invoice) *Corrective { p := inv.Preceding[0] c := &Corrective{ - InvoiceNumber: p.Code, - InvoiceSeriesCode: p.Series, + InvoiceNumber: p.Code.String(), + InvoiceSeriesCode: p.Series.String(), InvoiceIssueDate: p.IssueDate.String(), AdditionalReasonDescription: p.Reason, } @@ -88,25 +89,24 @@ func newCorrective(inv *bill.Invoice) *Corrective { c.TaxPeriod = newPeriodDates(period) // determine the reason from the extension - r := es.New() - kd := r.ExtensionDef(es.ExtKeyFacturaECorrection) - cc := p.Ext[es.ExtKeyFacturaECorrection] - row := kd.CodeDef(cc.Code()) + kd := tax.ExtensionForKey(facturae.ExtKeyCorrection) + cc := p.Ext[facturae.ExtKeyCorrection] + row := kd.ValueDef(cc.String()) if row != nil { - c.ReasonCode = row.Code.String() + c.ReasonCode = row.Value c.ReasonDescription = row.Name[i18n.ES] } // determine the method from the type of invoice - cm := cbc.Code("04") // default assume "authorized" + cm := "04" // default assume "authorized" switch inv.Type { case bill.InvoiceTypeCorrective: - cm = cbc.Code("01") + cm = "01" case bill.InvoiceTypeCreditNote, bill.InvoiceTypeDebitNote: - cm = cbc.Code("02") + cm = "02" } - md := methodDefs.CodeDef(cm) - c.CorrectionMethod = md.Code.String() + md := methodDefs.ValueDef(cm) + c.CorrectionMethod = md.Value c.CorrectionMethodDescription = md.Name[i18n.ES] return c diff --git a/go.mod b/go.mod index 4286478..5da069b 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,18 @@ module github.com/invopop/gobl.facturae -go 1.21 +go 1.22 -toolchain go1.22.0 +toolchain go1.22.5 require ( github.com/ghodss/yaml v1.0.0 - github.com/invopop/gobl v0.69.1 + github.com/invopop/gobl v0.200.0-rc4 github.com/invopop/xmldsig v0.8.0 github.com/lestrrat-go/libxml2 v0.0.0-20231124114421-99c71026c2f5 - github.com/magefile/mage v1.14.0 - github.com/spf13/cobra v1.6.1 + github.com/magefile/mage v1.15.0 + github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.8.4 - gitlab.com/flimzy/testy v0.12.2 + gitlab.com/flimzy/testy v0.14.0 ) require ( @@ -23,18 +23,19 @@ require ( github.com/beevik/etree v1.1.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/jsonschema v0.12.0 // indirect - github.com/invopop/validation v0.3.0 // indirect + github.com/invopop/validation v0.7.0 // indirect + github.com/invopop/yaml v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/otiai10/copy v1.7.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect - golang.org/x/crypto v0.17.0 // indirect + golang.org/x/crypto v0.26.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect software.sslmate.com/src/go-pkcs12 v0.2.0 // indirect diff --git a/go.sum b/go.sum index 0045f82..98b4f2b 100644 --- a/go.sum +++ b/go.sum @@ -2,7 +2,6 @@ cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -11,108 +10,100 @@ github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/gobl v0.67.8 h1:4PE6ZSxe2iM3JVZOosfooUbx5Nu406yLm7YkMb102GU= -github.com/invopop/gobl v0.67.8/go.mod h1:Jau+ajdfUCBPVH9VMor6aeYq3S9o7HuSNm07QxxxomE= -github.com/invopop/gobl v0.67.9 h1:iVtDIEDh9BfGJUo9ZPDXOfRrVExO1ncZqG4UmOrUjPk= -github.com/invopop/gobl v0.67.9/go.mod h1:Jau+ajdfUCBPVH9VMor6aeYq3S9o7HuSNm07QxxxomE= -github.com/invopop/gobl v0.69.1 h1:/Hgqx77E0npX0R1X46lRvmkbyXiFRZsi33Q3gG3vN/I= -github.com/invopop/gobl v0.69.1/go.mod h1:Jau+ajdfUCBPVH9VMor6aeYq3S9o7HuSNm07QxxxomE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/gobl v0.200.0-rc4 h1:MOElHvEx6dTIUyVRfIrpVXeOra/fYRP5lACqMnMXpYk= +github.com/invopop/gobl v0.200.0-rc4/go.mod h1:DmPohPel8b3ta4nDKnXRNzWQlB89cN74e0/WwPUEZUU= github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= -github.com/invopop/validation v0.3.0 h1:o260kbjXzoBO/ypXDSSrCLL7SxEFUXBsX09YTE9AxZw= -github.com/invopop/validation v0.3.0/go.mod h1:qIBG6APYLp2Wu3/96p3idYjP8ffTKVmQBfKiZbw0Hts= +github.com/invopop/validation v0.7.0 h1:NBPLqvYGmLZLQuk5jh0PbaBBetJW7f2VEk/BTWJkGBU= +github.com/invopop/validation v0.7.0/go.mod h1:nLLeXYPGwUNfdCdJo7/q3yaHO62LSx/3ri7JvgKR9vg= github.com/invopop/xmldsig v0.8.0 h1:W/yRh/HcMSlZrkaVtIeycxmBLssXIfy437yNCvx4gD4= github.com/invopop/xmldsig v0.8.0/go.mod h1:dc3+2BYNw0vzauyZiOobTltp1t3BbvWSq7ae/F2gdk0= -github.com/invopop/yaml v0.1.0 h1:YW3WGUoJEXYfzWBjn00zIlrw7brGVD0fUKRYDPAPhrc= -github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= +github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/labstack/echo/v4 v4.9.1 h1:GliPYSpzGKlyOhqIbG8nmHBo3i1saKWFOgh41AN3b+Y= -github.com/labstack/echo/v4 v4.9.1/go.mod h1:Pop5HLc+xoc4qhTZ1ip6C0RtP7Z+4VzRLWZZFKqbbjo= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= +github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= github.com/lestrrat-go/libxml2 v0.0.0-20231124114421-99c71026c2f5 h1:lR4DHv41vdkhNPNDlr56n8BuLINQeWNeQAaAzBEOcuw= github.com/lestrrat-go/libxml2 v0.0.0-20231124114421-99c71026c2f5/go.mod h1:/0MMipmS+5SMXCSkulsvJwYmddKI4IL5tVy6AZMo9n0= -github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= -github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.1-0.20240709150035-ccf4b4329d21 h1:igWZJluD8KtEtAgRyF4x6lqcxDry1ULztksMJh2mnQE= +github.com/rogpeppe/go-internal v1.12.1-0.20240709150035-ccf4b4329d21/go.mod h1:RMRJLmBOqWacUkmJHRMiPKh1S1m3PA7Zh4W80/kWPpg= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 h1:wD1IWQwAhdWclCwaf6DdzgCAe9Bfz1M+4AHRd7N786Y= github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= -gitlab.com/flimzy/testy v0.12.2 h1:m4JS/yYRUi8k/KbcxJrRw6eTHYnVmHm9XRKALrtwB9g= -gitlab.com/flimzy/testy v0.12.2/go.mod h1:9wPR98kErJw1lrq/aIJ8UZ6A0Dn7CHU0T6Qx4b2FiyQ= +gitlab.com/flimzy/testy v0.14.0 h1:2nZV4Wa1OSJb3rOKHh0GJqvvhtE03zT+sKnPCI0owfQ= +gitlab.com/flimzy/testy v0.14.0/go.mod h1:m3aGuwdXc+N3QgnH+2Ar2zf1yg0UxNdIaXKvC5SlfMk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/xmlpath.v1 v1.0.0-20140413065638-a146725ea6e7 h1:zibSPXbkfB1Dwl76rJgLa68xcdHu42qmFTe6vAnU4wA= gopkg.in/xmlpath.v1 v1.0.0-20140413065638-a146725ea6e7/go.mod h1:wo0SW5T6XqIKCCAge330Cd5sm+7VI6v85OrQHIk50KM= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/invoices.go b/invoices.go index 987370d..e4dc144 100644 --- a/invoices.go +++ b/invoices.go @@ -1,11 +1,11 @@ package facturae import ( + "github.com/invopop/gobl/addons/es/facturae" "github.com/invopop/gobl/bill" "github.com/invopop/gobl/cal" "github.com/invopop/gobl/cbc" "github.com/invopop/gobl/num" - "github.com/invopop/gobl/regimes/es" "github.com/invopop/gobl/tax" ) @@ -125,7 +125,7 @@ func (inv *Invoice) setTaxes(taxes *tax.Total) { if rt.Surcharge != nil { st := rt.Surcharge p := st.Percent - p.Amount = p.Amount.Rescale(4) // we need 2 decimal places + p = p.Rescale(4) // we need 2 decimal places tax.Surcharge = p.StringWithoutSymbol() v := makeAmount(st.Amount) tax.SurchargeAmount = &v @@ -148,14 +148,14 @@ func (inv *Invoice) setTaxes(taxes *tax.Total) { func newInvoiceHeader(inv *bill.Invoice) *InvoiceHeader { h := &InvoiceHeader{ - InvoiceNumber: inv.Code, - InvoiceSeriesCode: inv.Series, + InvoiceNumber: inv.Code.String(), + InvoiceSeriesCode: inv.Series.String(), } - ss := inv.ScenarioSummary() - - h.InvoiceDocumentType = ss.Codes[es.KeyFacturaEInvoiceDocumentType].String() - h.InvoiceClass = ss.Codes[es.KeyFacturaEInvoiceClass].String() + if inv.Tax != nil { + h.InvoiceDocumentType = inv.Tax.Ext[facturae.ExtKeyDocType].String() + h.InvoiceClass = inv.Tax.Ext[facturae.ExtKeyInvoiceClass].String() + } // Only one preceding document currently supported if len(inv.Preceding) > 0 { diff --git a/items.go b/items.go index f3e4a58..6fd522c 100644 --- a/items.go +++ b/items.go @@ -100,7 +100,7 @@ func (l *InvoiceLine) addTaxes(total num.Amount, taxes *tax.Total, rates tax.Set tax.Amount = makeAmount(percent.Of(total)) if rate.Surcharge != nil { p := *rate.Surcharge - p.Amount = p.Amount.Rescale(4) + p = p.Rescale(4) tax.Surcharge = p.StringWithoutSymbol() v := makeAmount(rate.Surcharge.Of(total)) tax.SurchargeAmount = &v diff --git a/payments.go b/payments.go index d719926..d1b5b7e 100644 --- a/payments.go +++ b/payments.go @@ -80,7 +80,7 @@ func newPaymentDetails(paymentInfo *bill.Payment) *PaymentDetails { if len(xmlInstallment.CollectionAdditionalInformation) > 0 { xmlInstallment.CollectionAdditionalInformation += "\n" } - xmlInstallment.CollectionAdditionalInformation += instructions.Online[0].Address + xmlInstallment.CollectionAdditionalInformation += instructions.Online[0].URL } } diff --git a/tax_id.go b/tax_id.go index acd9167..c7b50d1 100644 --- a/tax_id.go +++ b/tax_id.go @@ -15,7 +15,7 @@ type TaxID struct { } // NewTaxID builds the tax identification information of a party -func NewTaxID(taxNumber cbc.Code, countryCode l10n.CountryCode) *TaxID { +func NewTaxID(taxNumber cbc.Code, countryCode l10n.TaxCountryCode) *TaxID { return &TaxID{ PersonTypeCode: personTypeCode(taxNumber), ResidenceTypeCode: residenceTypeCode(countryCode), @@ -51,7 +51,7 @@ func personTypeCode(taxNumber cbc.Code) string { return "J" } -func residenceTypeCode(countryCode l10n.CountryCode) string { +func residenceTypeCode(countryCode l10n.TaxCountryCode) string { if residesInSpain(countryCode) { return "R" } else if residesInEU(countryCode) { @@ -61,12 +61,12 @@ func residenceTypeCode(countryCode l10n.CountryCode) string { } } -func residesInSpain(countryCode l10n.CountryCode) bool { - return countryCode == l10n.ES +func residesInSpain(countryCode l10n.TaxCountryCode) bool { + return countryCode == l10n.ES.Tax() } -func residesInEU(countryCode l10n.CountryCode) bool { - switch countryCode { +func residesInEU(countryCode l10n.TaxCountryCode) bool { + switch countryCode.Code() { case l10n.BE, // Belgium l10n.BG, // Bulgaria diff --git a/test/data/credit-note.json b/test/data/credit-note.json index 33e866f..5adab41 100644 --- a/test/data/credit-note.json +++ b/test/data/credit-note.json @@ -4,11 +4,16 @@ "uuid": "6df27ecc-d23d-11ee-b20e-8e3f6d4fff0a", "dig": { "alg": "sha256", - "val": "8da66d954b8b8c7a1a254a222034707b7c40b2a2ba199b95b6ea0876abf9562b" + "val": "fe42a6d30816c5fb8b96a98cf65935a1e850caea77e4839bbbf418d29547c6c3" } }, "doc": { "$schema": "https://gobl.org/draft-0/bill/invoice", + "$regime": "ES", + "$addons": [ + "es-facturae-v3" + ], + "uuid": "01922b1e-e283-7860-96aa-c57af9ffe67b", "type": "credit-note", "code": "TEST01001R", "issue_date": "2021-12-08", @@ -16,13 +21,19 @@ "preceding": [ { "type": "standard", - "code": "TEST01001F", "issue_date": "2021-12-08", + "code": "TEST01001F", "ext": { "es-facturae-correction": "01" } } ], + "tax": { + "ext": { + "es-facturae-doc-type": "FC", + "es-facturae-invoice-class": "OR" + } + }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", diff --git a/test/data/credit-note.yaml b/test/data/credit-note.yaml index e7f616c..17584e6 100644 --- a/test/data/credit-note.yaml +++ b/test/data/credit-note.yaml @@ -4,6 +4,7 @@ head: doc: $schema: "https://gobl.org/draft-0/bill/invoice" + $addons: ["es-facturae-v3"] type: "credit-note" code: "TEST01001R" currency: EUR diff --git a/test/data/invoice-vat-irpf-inc.json b/test/data/invoice-vat-irpf-inc.json index 3732ca5..662ad9b 100644 --- a/test/data/invoice-vat-irpf-inc.json +++ b/test/data/invoice-vat-irpf-inc.json @@ -4,18 +4,26 @@ "uuid": "679f2f25-7483-11ec-9722-7ea2cb436ff6", "dig": { "alg": "sha256", - "val": "8b6e44baa280870de186b9a2efdea3dd8c314278de90878e00f925b6aeffb1df" + "val": "13d655e0e6b8b9b8f9f031cba34a1536aafa6266e7204b40ed532f2e0e927ca9" } }, "doc": { "$schema": "https://gobl.org/draft-0/bill/invoice", - "uuid": "01920bef-05f6-7dc3-ba7d-bec3746889b7", + "$regime": "ES", + "$addons": [ + "es-facturae-v3" + ], + "uuid": "01922b1e-e284-7e1a-a75b-db3e8499063a", "type": "standard", "code": "TEST01002F", "issue_date": "2021-12-08", "currency": "EUR", "tax": { - "prices_include": "VAT" + "prices_include": "VAT", + "ext": { + "es-facturae-doc-type": "FC", + "es-facturae-invoice-class": "OO" + } }, "supplier": { "name": "Hypeprop S.L.", @@ -234,4 +242,4 @@ "payable": "3790.88" } } -} +} \ No newline at end of file diff --git a/test/data/invoice-vat-irpf-inc.yaml b/test/data/invoice-vat-irpf-inc.yaml index cb5f8b1..876ef5d 100644 --- a/test/data/invoice-vat-irpf-inc.yaml +++ b/test/data/invoice-vat-irpf-inc.yaml @@ -3,6 +3,7 @@ head: uuid: "679f2f25-7483-11ec-9722-7ea2cb436ff6" doc: $schema: "https://gobl.org/draft-0/bill/invoice" + $addons: ["es-facturae-v3"] code: "TEST01002F" currency: EUR issue_date: "2021-12-08" diff --git a/test/data/invoice-vat-irpf.json b/test/data/invoice-vat-irpf.json index 472299d..6a41b29 100644 --- a/test/data/invoice-vat-irpf.json +++ b/test/data/invoice-vat-irpf.json @@ -4,15 +4,26 @@ "uuid": "679f2f25-7483-11ec-9722-7ea2cb436ff6", "dig": { "alg": "sha256", - "val": "e1ce8fdeefb9252533d7051f5da34970b81e8815288eb63373b0a7e2b8cc1fe6" + "val": "543d8dac323f3d69483f0fb3ef78c56068ae545e0e7ada5d701b9c716bc5a9bd" } }, "doc": { "$schema": "https://gobl.org/draft-0/bill/invoice", + "$regime": "ES", + "$addons": [ + "es-facturae-v3" + ], + "uuid": "01922b1e-e286-7168-a7b4-c8ed9f158818", "type": "standard", "code": "TEST01002F", "issue_date": "2021-12-08", "currency": "EUR", + "tax": { + "ext": { + "es-facturae-doc-type": "FC", + "es-facturae-invoice-class": "OO" + } + }, "supplier": { "name": "Maria Serivces", "tax_id": { diff --git a/test/data/invoice-vat-irpf.yaml b/test/data/invoice-vat-irpf.yaml index 30d9393..e1e2f3d 100644 --- a/test/data/invoice-vat-irpf.yaml +++ b/test/data/invoice-vat-irpf.yaml @@ -4,6 +4,7 @@ head: doc: $schema: "https://gobl.org/draft-0/bill/invoice" + $addons: ["es-facturae-v3"] code: "TEST01002F" currency: EUR issue_date: "2021-12-08" diff --git a/test/data/invoice-vat-provider.json b/test/data/invoice-vat-provider.json index 2fdb166..2472212 100644 --- a/test/data/invoice-vat-provider.json +++ b/test/data/invoice-vat-provider.json @@ -4,15 +4,26 @@ "uuid": "679f2f25-7483-11ec-9722-7ea2cb436ff6", "dig": { "alg": "sha256", - "val": "5fb2f7d316ebcf761d5bfcb44f850b959354ec6e440e6abafb3faeb3202489dd" + "val": "64b6c3826e126b1ca6c5dd6b435c96dd68f9fc14ad34216188b151b433d6f1ae" } }, "doc": { "$schema": "https://gobl.org/draft-0/bill/invoice", + "$regime": "ES", + "$addons": [ + "es-facturae-v3" + ], + "uuid": "01922b1e-e287-747b-a04b-774d0cc2c1d0", "type": "standard", "code": "TEST01001F", "issue_date": "2021-12-08", "currency": "EUR", + "tax": { + "ext": { + "es-facturae-doc-type": "FC", + "es-facturae-invoice-class": "OO" + } + }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", diff --git a/test/data/invoice-vat-provider.yaml b/test/data/invoice-vat-provider.yaml index d52d603..7d4dae0 100644 --- a/test/data/invoice-vat-provider.yaml +++ b/test/data/invoice-vat-provider.yaml @@ -4,6 +4,7 @@ head: doc: $schema: "https://gobl.org/draft-0/bill/invoice" + $addons: ["es-facturae-v3"] code: "TEST01001F" currency: EUR issue_date: "2021-12-08" diff --git a/test/data/invoice-vat.json b/test/data/invoice-vat.json index 4e63f79..9f0f777 100644 --- a/test/data/invoice-vat.json +++ b/test/data/invoice-vat.json @@ -4,15 +4,26 @@ "uuid": "679f2f25-7483-11ec-9722-7ea2cb436ff6", "dig": { "alg": "sha256", - "val": "f018059be415bf1f263133072f43cbc90171bb4f31173c5212157279636fb607" + "val": "7bcf27c52304384f0bd39114e16d322bfb9ff8c7701566df4bf0287f45a0e6c5" } }, "doc": { "$schema": "https://gobl.org/draft-0/bill/invoice", + "$regime": "ES", + "$addons": [ + "es-facturae-v3" + ], + "uuid": "01922b1e-e288-7ab9-82f3-0c8c8c7956bc", "type": "standard", "code": "TEST01001F", "issue_date": "2021-12-08", "currency": "EUR", + "tax": { + "ext": { + "es-facturae-doc-type": "FC", + "es-facturae-invoice-class": "OO" + } + }, "supplier": { "name": "Hypeprop Sl", "alias": "Hypeprop", diff --git a/test/data/invoice-vat.yaml b/test/data/invoice-vat.yaml index 220b575..59d0855 100644 --- a/test/data/invoice-vat.yaml +++ b/test/data/invoice-vat.yaml @@ -4,6 +4,7 @@ head: doc: $schema: "https://gobl.org/draft-0/bill/invoice" + $addons: ["es-facturae-v3"] code: "TEST01001F" currency: EUR issue_date: "2021-12-08"