From fb6e5076bb0d5db7ec2490c4bd55ca788533ab3c Mon Sep 17 00:00:00 2001 From: Gerard Dalmau Date: Thu, 1 Jun 2017 14:54:39 +0200 Subject: [PATCH 1/2] Split invoices_record models --- sii/models/invoices.py | 61 ++++++++++++++++++++++++++++++++++ sii/models/invoices_record.py | 62 +++-------------------------------- 2 files changed, 66 insertions(+), 57 deletions(-) create mode 100644 sii/models/invoices.py diff --git a/sii/models/invoices.py b/sii/models/invoices.py new file mode 100644 index 0000000..e2b09fb --- /dev/null +++ b/sii/models/invoices.py @@ -0,0 +1,61 @@ +# coding=utf-8 + +from marshmallow import Schema, fields, post_dump +from marshmallow import validate, validates, validates_schema, ValidationError +from sii import __SII_VERSION__ +from datetime import datetime + +PERIODO_VALUES = [ + '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '0A' +] + + +class DateString(fields.String): + def _validate(self, value): + if value is None: + return None + try: + datetime.strptime(value, '%Y-%m-%d') + except (ValueError, AttributeError): + raise ValidationError('Invalid date string', value) + + @post_dump + def _serialize(self, value, attr, obj): + return datetime.strptime(value, '%Y-%m-%d').strftime('%d-%m-%Y') + + +class MySchema(Schema): + @validates_schema(pass_original=True) + def check_unknown_fields(self, data, original_data): + unknown = list(set(original_data) - set(self.fields)) + if unknown: + raise ValidationError('Unknown field', unknown) + + +class NIF(MySchema): + NIF = fields.String(required=True, validate=validate.Length(max=9)) + + +class Titular(NIF): + NombreRazon = fields.String( + required=True, validate=validate.Length(max=120) + ) + + +class Contraparte(Titular): + pass + + +class Cabecera(MySchema): + IDVersionSii = fields.String(required=True, default=__SII_VERSION__) + Titular = fields.Nested(Titular, required=True) + + +class PeriodoImpositivo(MySchema): + Ejercicio = fields.String( + required=True, + validate=validate.OneOf([str(x) for x in range(0, 10000)]) + ) + Periodo = fields.String( + required=True, validate=validate.OneOf(PERIODO_VALUES) + ) diff --git a/sii/models/invoices_record.py b/sii/models/invoices_record.py index b118e40..7ac3920 100644 --- a/sii/models/invoices_record.py +++ b/sii/models/invoices_record.py @@ -1,9 +1,8 @@ # coding=utf-8 -from marshmallow import Schema, fields, post_dump -from marshmallow import validate, validates, validates_schema, ValidationError -from sii import __SII_VERSION__ -from datetime import datetime +from marshmallow import fields, validate +from invoices import MySchema, DateString +from invoices import Cabecera, NIF, Contraparte, PeriodoImpositivo TIPO_COMUNICACION_VALUES = ['A0', 'A1', 'A4'] @@ -11,10 +10,6 @@ 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'R1', 'R2', 'R3', 'R4', 'R5' ] -PERIODO_VALUES = [ - '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '0A' -] - TIPO_NO_EXENTA_VALUES = ['S1', 'S2', 'S3'] TIPO_RECTIFICATIVA_VALUES = ['S', 'I'] @@ -76,55 +71,12 @@ ] -class DateString(fields.String): - def _validate(self, value): - if value is None: - return None - try: - datetime.strptime(value, '%Y-%m-%d') - except (ValueError, AttributeError): - raise ValidationError('Invalid date string', value) - - @post_dump - def _serialize(self, value, attr, obj): - return datetime.strptime(value, '%Y-%m-%d').strftime('%d-%m-%Y') - - -class MySchema(Schema): - @validates_schema(pass_original=True) - def check_unknown_fields(self, data, original_data): - unknown = list(set(original_data) - set(self.fields)) - if unknown: - raise ValidationError('Unknown field', unknown) - - -class NIF(MySchema): - NIF = fields.String(required=True, validate=validate.Length(max=9)) - - -class Titular(NIF): - NombreRazon = fields.String( - required=True, validate=validate.Length(max=120) - ) - - -class Cabecera(MySchema): - IDVersionSii = fields.String(required=True, default=__SII_VERSION__) - Titular = fields.Nested(Titular, required=True) +class CabeceraRegistro(Cabecera): TipoComunicacion = fields.String( required=True, validate=validate.OneOf(TIPO_COMUNICACION_VALUES) ) -class PeriodoImpositivo(MySchema): - Ejercicio = fields.String(required=True, validate=validate.OneOf( - [str(x) for x in range(0, 10000)] - )) - Periodo = fields.String( - required=True, validate=validate.OneOf(PERIODO_VALUES) - ) - - class EmisorFactura(NIF): pass @@ -194,10 +146,6 @@ class TipoDesglose(MySchema): # TODO obligatorio uno de los dos pero sólo pued DesgloseTipoOperacion = fields.Nested(DesgloseTipoOperacion) -class Contraparte(Titular): - pass - - class ImporteRectificacion(MySchema): BaseRectificada = fields.Float(required=True) CuotaRectificada = fields.Float(required=True) @@ -241,7 +189,7 @@ class FacturaEmitida(Factura): class RegistroFacturas(MySchema): - Cabecera = fields.Nested(Cabecera, required=True) + Cabecera = fields.Nested(CabeceraRegistro, required=True) class RegistroFacturasEmitidas(RegistroFacturas): From e7d06e2c8eff6454da62d9f70309c57e90f47781 Mon Sep 17 00:00:00 2001 From: Gerard Dalmau Date: Thu, 1 Jun 2017 14:55:00 +0200 Subject: [PATCH 2/2] Add uncompleted invoices_consult models --- sii/models/invoices_consult.py | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 sii/models/invoices_consult.py diff --git a/sii/models/invoices_consult.py b/sii/models/invoices_consult.py new file mode 100644 index 0000000..0ce4266 --- /dev/null +++ b/sii/models/invoices_consult.py @@ -0,0 +1,48 @@ +# coding=utf-8 + +from marshmallow import fields, validate +from invoices import MySchema, DateString +from invoices import Cabecera, PeriodoImpositivo, Contraparte + +FACTURA_MODIFICADA_VALUES = ['S', 'N'] + + +class RangoFechaPresentacion(MySchema): + Desde = DateString() + Hasta = DateString() + + +class FiltroConsulta(MySchema): + PeriodoImpositivo = fields.Nested(PeriodoImpositivo, required=True) + # TODO add IDFactura + Contraparte = fields.Nested(Contraparte) + FechaPresentacion = fields.Nested(RangoFechaPresentacion) + FacturaModificada = fields.String( + validate=validate.OneOf(FACTURA_MODIFICADA_VALUES) + ) + # TODO add EstadoCuadre + # TODO add ClavePaginacion + + +class ConsultaFacturas(MySchema): + Cabecera = fields.Nested(Cabecera, required=True) + + +class ConsultaFacturasRecibidas(ConsultaFacturas): + FiltroConsulta = fields.Nested(FiltroConsulta, required=True) + + +class ConsultaLRFacturasRecibidas(MySchema): + ConsultaLRFacturasRecibidas = fields.Nested( + ConsultaFacturasRecibidas, required=True + ) + + +class ConsultaFacturasRecibidas(ConsultaFacturas): + FiltroConsulta = fields.Nested(FiltroConsulta, required=True) + + +class ConsultaLRFacturasEmitidas(MySchema): + ConsultaLRFacturasEmitidas = fields.Nested( + ConsultaFacturasEmitidas, required=True + )