Skip to content

Instantly share code, notes, and snippets.

@ryllada
Created October 11, 2016 11:39
Show Gist options
  • Save ryllada/dcdbe7cc094e11f3d6b5798431e81af1 to your computer and use it in GitHub Desktop.
Save ryllada/dcdbe7cc094e11f3d6b5798431e81af1 to your computer and use it in GitHub Desktop.
# -*- coding: UTF-8 -*-
from reportlab.graphics.barcode import createBarcodeDrawing
from reportlab.lib.pagesizes import cm
class CuentaCobroCuaderno60(models.Model):
""" Cuentas asociadas al Cuaderno 60, en las que el tercero hace los
ingresos para el pago de actividades, reserva de recintos, etc.
"""
cuenta = models.ForeignKey('CuentaCobro')
codigo_ine_provincia = models.CharField(
u'Código INE de la provincia', max_length=2)
codigo_ine_municipio = models.CharField(
u'Código INE del municipio', max_length=3)
codigo_tributo = models.CharField(
u'Código del tributo', choices=CODIGO_TRIBUTO_CUADERNO60, max_length=3)
dias_vigencia_recibo = models.PositiveIntegerField(
_(u'Días de vigencia del recibo'), default=7)
texto_a_mostrar_en_recibo = models.CharField(
max_length=500, null=True, blank=True)
def __unicode__(self):
return unicode(self.cuenta)
def clean(self):
if (not self.codigo_ine_provincia.isdigit() or
len(self.codigo_ine_provincia) != 2):
raise ValidationError(u'El código INE de la provincia no es válido')
if (not self.codigo_ine_municipio.isdigit() or
len(self.codigo_ine_municipio) != 3):
raise ValidationError(u'El código INE del municipio no es válido')
return
def get_codigo_barras(self, id_inscripcion, importe, fecha_tributo):
self.id_inscripcion = id_inscripcion
self.fecha_tributo = fecha_tributo
self.importe = importe
self.importe_str = formatear_importe(importe)
self.entidad_emisora = self.get_entidad_emisora()
if not self.entidad_emisora:
return None
self.identificacion = self.get_identificacion()
self.referencia = self.get_referencia()
self.numeracion_codigo_barras = "90521%s%s%s%s0" % (
self.entidad_emisora,
self.referencia,
self.identificacion,
rellenar_ceros(self.importe_str, 8),
)
return self.numeracion_codigo_barras
def get_entidad_emisora(self):
_cadena = "%s%s" % (
self.codigo_ine_provincia,
self.codigo_ine_municipio,
)
if len(_cadena) != 5 or not _cadena.isdigit():
return ""
# Calculamos el dígito de control
_pesos = (6, 5, 4, 3, 2, )
_suma = 0
for index, caracter in enumerate(_cadena):
_suma += int(caracter) * _pesos[index]
_digito_control = str(_suma % 11)
if _digito_control == "10":
_digito_control = "0"
return "%s%s%s" % (
self.codigo_ine_provincia,
self.codigo_ine_municipio,
_digito_control,
)
def get_identificacion(self):
_fecha_limite = self.get_fecha_limite()
_fecha_juliana = rellenar_ceros(julian_days(_fecha_limite), 3)
return "1%s%s%s%s" % (
self.codigo_tributo,
str(self.fecha_tributo.year)[-2:],
str(_fecha_limite.year)[-1:],
_fecha_juliana,
)
def get_referencia(self):
a = int(self.entidad_emisora) * 76
b = self.id_inscripcion * 9
c = (int(self.identificacion) + int(self.importe_str) - 1) * 55
d = (a + b + c) / 97.0
_parte_decimal = d - int(d)
d = int(_parte_decimal * 100)
_digito_control = str(99 - d)
return "%s%s" % (
rellenar_ceros(self.id_inscripcion, 10),
rellenar_ceros(_digito_control, 2),
)
def get_fecha_limite(self):
return self.fecha_tributo + timedelta(days=self.dias_vigencia_recibo)
def get_path_imagen_codigo_barras(self):
_extension = "bmp"
_barcode = createBarcodeDrawing(
'Code128', width=20*cm, height=2*cm,
value=self.numeracion_codigo_barras, humanReadable=False)
_barcode.save(
formats=[_extension], outDir=settings.TEMP_ROOT,
fnRoot=self.numeracion_codigo_barras, _renderPM_dpi=300)
_path_file = os.path.join(settings.TEMP_ROOT, "%s.%s" % (
self.numeracion_codigo_barras, _extension, ))
self.path_imagen_codigo_barras = _path_file
return _path_file
class CuentaCobro(models.Model):
tecnico = models.IntegerField(null=False)
fecha_creacion = models.DateField(
default=datetime.date.today, null=False, blank=False)
nombre = models.CharField(u'Nombre', max_length=200)
descripcion = models.TextField(
_(u"Descripción"), max_length=300, blank=True)
cuenta_activa = models.BooleanField(default=True, null=False)
tipo = models.PositiveSmallIntegerField(choices=TIPO_CUENTA_CF, default=10)
objects = CuentaCobroManager()
def check(self):
try:
self.get_datos()
except Exception as excpt:
print u"Excepción determinando cuenta:", excpt
return False
return True
def get_datos(self):
""" Devuelve la cuenta real como tal
"""
_cuenta = None
if self.tipo == 10:
_cuenta = self.cuentacobroingreso_set.all()
elif self.tipo == 110:
_cuenta = self.cuentacobroceca_set.all()
elif self.tipo == 120:
_cuenta = self.cuentacobrosermepa_set.all()
elif self.tipo == 210:
_cuenta = self.cuentacobrocuaderno60_set.all()
elif self.tipo == 220:
_cuenta = self.cuentacobrocuaderno57_set.all()
if not _cuenta:
return None
if _cuenta.count() != 1:
return None
return _cuenta[0]
def is_tipo_tpv(self):
return bool(self.tipo in (110, 120, ))
def __unicode__(self):
_msg = u''
if not self.cuenta_activa:
_msg = u'[%s] ' % _(u'DESACTIVADA')
_msg = u'%s%s' % (_msg, self.nombre, )
_msg = u'%s (%s)' % (_msg, self.get_tipo_display(), )
_cuenta = self.get_datos()
if hasattr(_cuenta, 'extra_display'):
_msg = u'%s %s' % (_msg, _cuenta.extra_display(), )
return _msg
TIPO_CUENTA_CF = (
(10, _(u'Ingreso Bancario'), ),
(110, _(u'TPV CECA'), ),
(120, _(u'TPV Sermepa'), ),
(210, _(u'Cuenta Cuaderno 60'), ),
(220, _(u'Cuenta Cuaderno 57'), ),
)
CODIGO_TRIBUTO_CUADERNO60 = (
('001', _(u'Impuesto sobre bienes inmuebles (Urbana)'), ),
('002', _(u'Impuesto sobre bienes inmuebles (Rústica)'), ),
('003', _(u'Impuesto sobre vehículos de tracción mecánica'), ),
('004', _(u'Impuesto sobre incremento del valor de los terrenos'), ),
('005', _(u'Impuesto sobre construcciones, instalaciones y obras'), ),
('010', _(u'Impuesto sobre actividades económicas'), ),
('011', _(u'Tasa basuras domiciliarias'), ),
('012', _(u'Tasa de basuras comerciales'), ),
('013', _(u'Tasa basuras industriales'), ),
('014', _(u'Tasa eliminación residuos sólidos'), ),
('015', _(u'Tasa alcantarillado'), ),
('016', _(u'Tasa de cementerio municipal'), ),
('017', _(u'Tasa de inspección'), ),
('018', _(u'Tasa por expedición de documentos'), ),
('019', _(u'Tasa por licencia auto-taxi, vehículos alquiler'), ),
('020', _(u'Tasa por licencias urbanísticas'), ),
('021', _(u'Tasa por licencia apertura establecimientos'), ),
('022', _(u'Tasa por retirada vehículos vía pública'), ),
('023', _(u'Tasa de saneamiento'), ),
('024', _(u'Tasa por servicios espectáculos públicos'), ),
('025', _(u'Tasa de basuras de mercados municipales'), ),
('041', _(u'Precio Público por entrada vehículos (vados)'), ),
('042', _(u'Precio Público por suministro de aguas'), ),
('043', _(u"""Precio Público por ocupación suelo, subsuelo y vuelo de la
vía pública"""), ),
('044', _(u'Precio Público por ocupación vía pública'), ),
('045', _(u'Precio Público por paradas mercado municipal'), ),
('046', _(u'Precio Público por guardería'), ),
('047', _(u'Precio Público por instalaciones deportivas'), ),
('048', _(u'Precio Público por matadero municipal'), ),
('049', _(u'Precio Público por prestaciones personales'), ),
('050', _(u'Precio Público por vigilancia'), ),
('051', _(u'Precio Público por comedores escolares'), ),
('052', _(u'Precio Público centros docentes escolares'), ),
('053', _(u'Precio Público sobre rodaje y arrastre de vehículos'), ),
('054', _(u'Precio Público lucha contra la piedra'), ),
('055', _(u'Precio Público por exhibición de rótulos'), ),
('056', _(u'Precio Público sobre rieles, cables, palos, etc.'), ),
('057', _(u'Precio Público por aprovechamientos especiales'), ),
('058', _(u'Precio Público instalación de aparadores y vitrinas'), ),
('059', _(u'Servicios sanitarios'), ),
('060', _(u"""Precio Público sobre instalaciones en terrenos de uso
público"""), ),
('061', _(u'Contribuciones especiales'), ),
('062', _(u'I.V.A. Reducido'), ),
('063', _(u'I.V.A. Ordinario'), ),
('064', _(u'Multas'), ),
('065', _(u'Alquiler sepulturas'), ),
('066', _(u'Tenencia de perros'), ),
('067', _(u'Intereses de demora'), ),
('068', _(u'Recargo de apremio'), ),
('069', _(u'Máquinas recreativas'), ),
('070', _(u'Alta vehículos tracción mecánica'), ),
('071', _(u'Ingresos directos'), ),
('072', _(u'Bicicletas'), ),
('073', _(u'Otros ingresos tributarios'), ),
('074', _(u'Tasa garantía suministro'), ),
('091', _(u'Agrupación de tributos sobre industria-comercio'), ),
('092', _(u'Agrupación de tributos sobre inmuebles'), ),
('096', _(u'Agrupación conceptos en liquidaciones por ingreso directo'), ),
('097', _(u'Cámara propiedad urbana'), ),
('098', _(u'Cámara de comercio'), ),
('099', _(u'Cámara de comercio. Complemento'), ),
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment