Created
October 11, 2016 11:39
-
-
Save ryllada/dcdbe7cc094e11f3d6b5798431e81af1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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