Agregar depósitos

This commit is contained in:
Mauricio Baeza 2017-11-23 23:56:03 -06:00
parent 2e9dadf301
commit 9cb6dbf0b2
5 changed files with 234 additions and 50 deletions

View File

@ -294,6 +294,13 @@ class AppMovimientosBanco(object):
req.context['result'] = self._db.add_movbanco(values) req.context['result'] = self._db.add_movbanco(values)
resp.status = falcon.HTTP_200 resp.status = falcon.HTTP_200
def on_delete(self, req, resp):
values = req.params
if self._db.delete('movbanco', values['id']):
resp.status = falcon.HTTP_200
else:
resp.status = falcon.HTTP_204
class AppFolios(object): class AppFolios(object):

View File

@ -17,6 +17,9 @@ class StorageEngine(object):
def _get_configtimbrar(self, values): def _get_configtimbrar(self, values):
return main.config_timbrar() return main.config_timbrar()
def _get_saldocuenta(self, values):
return main.CuentasBanco.get_saldo(values['id'])
def _get_validartimbrar(self, values): def _get_validartimbrar(self, values):
return main.validar_timbrar() return main.validar_timbrar()
@ -169,6 +172,8 @@ class StorageEngine(object):
return main.SATImpuestos.remove(id) return main.SATImpuestos.remove(id)
if table == 'cuentasbanco': if table == 'cuentasbanco':
return main.CuentasBanco.remove(id) return main.CuentasBanco.remove(id)
if table == 'movbanco':
return main.MovimientosBanco.remove(id)
return False return False
def _get_client(self, values): def _get_client(self, values):

View File

@ -219,6 +219,28 @@ class Usuarios(BaseModel):
order_by = ('nombre', 'apellidos') order_by = ('nombre', 'apellidos')
class Registro(BaseModel):
usuario = TextField()
accion = TextField(default='')
tabla = TextField(default='')
fecha = DateTimeField(default=util.now)
def __str__(self):
t = '{} {}-{} ({})'
return t.format(self.usuario, self.accion, self.tabla, self.fecha)
class Meta:
order_by = ('usuario', 'fecha')
@classmethod
def add(cls, values):
try:
Registro.create(**values)
return
except:
return
class SATRegimenes(BaseModel): class SATRegimenes(BaseModel):
key = TextField(index=True, unique=True) key = TextField(index=True, unique=True)
name = TextField(index=True) name = TextField(index=True)
@ -960,6 +982,14 @@ class CuentasBanco(BaseModel):
q = CuentasBanco.update(**fields).where(CuentasBanco.id==id) q = CuentasBanco.update(**fields).where(CuentasBanco.id==id)
return bool(q.execute()) return bool(q.execute())
@classmethod
def get_saldo(cls, id):
try:
obj = CuentasBanco.get(CuentasBanco.id==id)
return obj.saldo
except CuentasBanco.DoesNotExist:
return 0
@classmethod @classmethod
def remove(cls, id): def remove(cls, id):
try: try:
@ -1093,6 +1123,8 @@ class MovimientosBanco(BaseModel):
auto_round=True) auto_round=True)
saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6, saldo = DecimalField(default=0.0, max_digits=20, decimal_places=6,
auto_round=True) auto_round=True)
cancelado = BooleanField(default=False)
conciliado = BooleanField(default=False)
moneda = TextField(default='MXN') # Complemento de pagos moneda = TextField(default='MXN') # Complemento de pagos
tipo_cambio = DecimalField(default=1.0, max_digits=15, decimal_places=6, tipo_cambio = DecimalField(default=1.0, max_digits=15, decimal_places=6,
auto_round=True) auto_round=True)
@ -1115,34 +1147,41 @@ class MovimientosBanco(BaseModel):
.select() .select()
.where( .where(
(MovimientosBanco.cuenta==cuenta) & (MovimientosBanco.cuenta==cuenta) &
(MovimientosBanco.fecha<fecha))[-1] (MovimientosBanco.fecha<fecha) &
(MovimientosBanco.cancelado==False))[-1]
) )
return round(float(query.saldo), DECIMALES) return round(float(query.saldo), DECIMALES)
def _movimiento_anterior(self, cuenta, fecha):
query = (MovimientosBanco
.select()
.where(
(MovimientosBanco.cuenta==cuenta) &
(MovimientosBanco.fecha<fecha) &
(MovimientosBanco.cancelado==False))[-1]
)
return query
def _actualizar_saldos(self, row): def _actualizar_saldos(self, row):
query = (MovimientosBanco query = (MovimientosBanco
.select() .select()
.where( .where(
(MovimientosBanco.cuenta==row.cuenta) & (MovimientosBanco.cuenta==row.cuenta) &
(MovimientosBanco.fecha>row.fecha)) (MovimientosBanco.fecha>row.fecha) &
(MovimientosBanco.cancelado==False))
) )
saldo = row.saldo saldo = round(Decimal(row.saldo), DECIMALES)
if row.retiro:
importe = row.retiro * -1
else:
importe = row.deposito
for mov in query: for mov in query:
mov.saldo = saldo + importe mov.saldo = saldo + mov.deposito - mov.retiro
mov.save() mov.save()
saldo = mov.saldo saldo = mov.saldo
CuentasBanco.actualizar_saldo(None, saldo) CuentasBanco.actualizar_saldo(row.cuenta, saldo)
return saldo return saldo
@classmethod @classmethod
def add(cls, values): def add(cls, values):
#~ print(values) ids = values.pop('ids', '')
actualizar = False actualizar = False
if not 'saldo' in values: if not 'saldo' in values:
actualizar = True actualizar = True
@ -1167,9 +1206,30 @@ class MovimientosBanco(BaseModel):
if actualizar: if actualizar:
saldo = cls._actualizar_saldos(cls, obj) saldo = cls._actualizar_saldos(cls, obj)
if ids:
FacturasPagos.add(obj, util.loads(ids))
return {'ok': True, 'saldo': saldo} return {'ok': True, 'saldo': saldo}
@classmethod
def remove(cls, id):
try:
obj = MovimientosBanco.get(MovimientosBanco.id==id)
except MovimientosBanco.DoesNotExist:
return False
if obj.conciliado or obj.cancelado:
return False
with database_proxy.transaction():
obj.cancelado = True
obj.save()
obj = cls._movimiento_anterior(cls, obj.cuenta, obj.fecha)
cls._actualizar_saldos(cls, obj)
return True
@classmethod @classmethod
def con(cls, id): def con(cls, id):
cant = (MovimientosBanco cant = (MovimientosBanco
@ -1191,7 +1251,10 @@ class MovimientosBanco(BaseModel):
fd = (MovimientosBanco.fecha.between( fd = (MovimientosBanco.fecha.between(
util.get_date(rango['start']), util.get_date(rango['start']),
util.get_date(rango['end'], True))) util.get_date(rango['end'], True)))
filtros = (fd & (MovimientosBanco.cuenta==cuenta)) filtros = (fd &
(MovimientosBanco.cuenta==cuenta) &
(MovimientosBanco.cancelado==False)
)
else: else:
year = int(values['year']) year = int(values['year'])
mes = int(values['mes']) mes = int(values['mes'])
@ -1203,7 +1266,10 @@ class MovimientosBanco(BaseModel):
fm = (MovimientosBanco.fecha.month > 0) fm = (MovimientosBanco.fecha.month > 0)
else: else:
fm = (MovimientosBanco.fecha.month == mes) fm = (MovimientosBanco.fecha.month == mes)
filtros = (fy & fm & (MovimientosBanco.cuenta==cuenta)) filtros = (fy & fm &
(MovimientosBanco.cuenta==cuenta) &
(MovimientosBanco.cancelado==False)
)
rows = tuple(MovimientosBanco rows = tuple(MovimientosBanco
.select( .select(
@ -2933,22 +2999,22 @@ class FacturasComplementos(BaseModel):
return {r.nombre: util.loads(r.valores) for r in query} return {r.nombre: util.loads(r.valores) for r in query}
class CfdiPagosFacturas(BaseModel): # ~ class CfdiPagosFacturas(BaseModel):
pago = ForeignKeyField(CfdiPagos) # ~ pago = ForeignKeyField(CfdiPagos)
factura = ForeignKeyField(Facturas) # ~ factura = ForeignKeyField(Facturas)
numero = IntegerField(default=1) # ~ numero = IntegerField(default=1)
saldo_anterior = DecimalField(default=0.0, max_digits=20, decimal_places=6, # ~ saldo_anterior = DecimalField(default=0.0, max_digits=20, decimal_places=6,
auto_round=True) # ~ auto_round=True)
importe = DecimalField(default=0.0, max_digits=18, decimal_places=6, # ~ importe = DecimalField(default=0.0, max_digits=18, decimal_places=6,
auto_round=True) # ~ auto_round=True)
saldo = DecimalField(default=0.0, max_digits=18, decimal_places=6, # ~ saldo = DecimalField(default=0.0, max_digits=18, decimal_places=6,
auto_round=True) # ~ auto_round=True)
class Meta: # ~ class Meta:
order_by = ('pago',) # ~ order_by = ('pago',)
indexes = ( # ~ indexes = (
(('pago', 'factura', 'numero'), True), # ~ (('pago', 'factura', 'numero'), True),
) # ~ )
class PreFacturasRelacionadas(BaseModel): class PreFacturasRelacionadas(BaseModel):
@ -3093,21 +3159,28 @@ class FacturasImpuestos(BaseModel):
) )
#~ class FacturasPagos(BaseModel): class FacturasPagos(BaseModel):
#~ factura = ForeignKeyField(Facturas) movimiento = ForeignKeyField(MovimientosBanco)
#~ numero = IntegerField(default=1) factura = ForeignKeyField(Facturas)
#~ saldo_anterior = DecimalField(default=0.0, max_digits=20, decimal_places=6, numero = IntegerField(default=1)
#~ auto_round=True) saldo_anterior = DecimalField(default=0.0, max_digits=20, decimal_places=6,
#~ importe = DecimalField(default=0.0, max_digits=18, decimal_places=6, auto_round=True)
#~ auto_round=True) importe = DecimalField(default=0.0, max_digits=18, decimal_places=6,
#~ saldo = DecimalField(default=0.0, max_digits=18, decimal_places=6, auto_round=True)
#~ auto_round=True) saldo = DecimalField(default=0.0, max_digits=18, decimal_places=6,
auto_round=True)
#~ class Meta: class Meta:
#~ order_by = ('factura',) order_by = ('factura',)
#~ indexes = ( indexes = (
#~ (('factura', 'numero'), True), (('factura', 'numero'), True),
#~ ) )
@classmethod
def add(cls, mov, ids):
print (mov)
print (ids)
return
class PreFacturasImpuestos(BaseModel): class PreFacturasImpuestos(BaseModel):
@ -3168,10 +3241,8 @@ def authenticate(args):
respuesta['msg'] = '' respuesta['msg'] = ''
respuesta['login'] = True respuesta['login'] = True
respuesta['user'] = str(obj) respuesta['user'] = str(obj)
#~ respuesta['user'] = obj
respuesta['super'] = obj.es_superusuario respuesta['super'] = obj.es_superusuario
#~ respuesta['admin'] = obj.es_superusuario or obj.es_admin #~ respuesta['admin'] = obj.es_superusuario or obj.es_admin
#~ desconectar()
return respuesta, obj return respuesta, obj
@ -3262,15 +3333,15 @@ def _init_values(rfc):
def _crear_tablas(rfc): def _crear_tablas(rfc):
tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion, tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion,
Folios, Folios, Registro,
Emisor, Facturas, FacturasDetalle, FacturasImpuestos, Emisor, Facturas, FacturasDetalle, FacturasImpuestos, FacturasPagos,
FacturasRelacionadas, FacturasComplementos, Almacenes, Productos, FacturasRelacionadas, FacturasComplementos, Almacenes, Productos,
PreFacturas, PreFacturasDetalle, PreFacturasImpuestos, PreFacturas, PreFacturasDetalle, PreFacturasImpuestos,
PreFacturasRelacionadas, PreFacturasRelacionadas,
SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes, SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes,
SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos, SATTipoRelacion, SATUnidades, SATUsoCfdi, SATBancos,
Socios, Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco, Socios, Tags, Usuarios, CuentasBanco, TipoCambio, MovimientosBanco,
CfdiPagos, CfdiPagosFacturas, CfdiPagos,
Emisor.regimenes.get_through_model(), Emisor.regimenes.get_through_model(),
Socios.tags.get_through_model(), Socios.tags.get_through_model(),
Productos.impuestos.get_through_model(), Productos.impuestos.get_through_model(),

View File

@ -1,4 +1,6 @@
var msg = '' var msg = ''
var msg_importe = ''
var bancos_controllers = { var bancos_controllers = {
init: function(){ init: function(){
@ -7,6 +9,7 @@ var bancos_controllers = {
$$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click) $$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click)
$$('cmd_guardar_retiro').attachEvent('onItemClick', cmd_guardar_retiro_click) $$('cmd_guardar_retiro').attachEvent('onItemClick', cmd_guardar_retiro_click)
$$('cmd_guardar_deposito').attachEvent('onItemClick', cmd_guardar_deposito_click) $$('cmd_guardar_deposito').attachEvent('onItemClick', cmd_guardar_deposito_click)
$$('cmd_cancelar_movimiento').attachEvent('onItemClick', cmd_cancelar_movimiento_click)
$$('txt_retiro_importe').attachEvent('onChange', txt_retiro_importe_change) $$('txt_retiro_importe').attachEvent('onChange', txt_retiro_importe_change)
$$('txt_deposito_importe').attachEvent('onChange', txt_deposito_importe_change) $$('txt_deposito_importe').attachEvent('onChange', txt_deposito_importe_change)
$$('grid_cfdi_este_deposito').attachEvent('onAfterDrop', grid_cfdi_este_deposito_after_drop) $$('grid_cfdi_este_deposito').attachEvent('onAfterDrop', grid_cfdi_este_deposito_after_drop)
@ -98,6 +101,20 @@ function get_estado_cuenta(rango){
} }
function get_saldo_cuenta(){
var id = $$('lst_cuentas_banco').getValue()
webix.ajax().get('/values/saldocuenta', {id: id}, function(text, data){
var value = data.json()
if(value){
$$('txt_cuenta_saldo').setValue(value)
}else{
msg = 'No se pudo consultar el saldo'
msg_error(msg)
}
})
}
function lst_cuentas_banco_change(nv, ov){ function lst_cuentas_banco_change(nv, ov){
show('Cuenta change') show('Cuenta change')
} }
@ -147,6 +164,7 @@ function cmd_agregar_retiro_click(){
function cmd_agregar_deposito_click(){ function cmd_agregar_deposito_click(){
msg_importe = ''
get_bancos_forma_pago(false) get_bancos_forma_pago(false)
get_facturas_por_pagar() get_facturas_por_pagar()
$$('multi_bancos').setValue('banco_deposito') $$('multi_bancos').setValue('banco_deposito')
@ -174,6 +192,13 @@ function validate_retiro(values){
return false return false
} }
var today = new Date()
if(values.retiro_fecha > today){
msg = 'Fecha inválida, es una fecha futura'
msg_error(msg)
return
}
var horas = $$('time_retiro').getText().split(':') var horas = $$('time_retiro').getText().split(':')
var seg = parseInt(horas[2]) var seg = parseInt(horas[2])
var min = parseInt(horas[1]) var min = parseInt(horas[1])
@ -266,7 +291,6 @@ function cmd_guardar_retiro_click(){
function txt_retiro_importe_change(new_value, old_value){ function txt_retiro_importe_change(new_value, old_value){
showvar(new_value)
if(!isFinite(new_value)){ if(!isFinite(new_value)){
this.config.value = old_value this.config.value = old_value
this.refresh() this.refresh()
@ -383,6 +407,13 @@ function validate_deposito(values){
return false return false
} }
var today = new Date()
if(values.deposito_fecha > today){
msg = 'Fecha inválida, es una fecha futura'
msg_error(msg)
return
}
var horas = $$('time_deposito').getText().split(':') var horas = $$('time_deposito').getText().split(':')
var seg = parseInt(horas[2]) var seg = parseInt(horas[2])
var min = parseInt(horas[1]) var min = parseInt(horas[1])
@ -423,6 +454,10 @@ function validate_deposito(values){
msg_error(msg) msg_error(msg)
return false return false
} }
if(suma < importe){
msg_importe = 'El importe del depósito en mayor a la suma de facturas. '
msg_importe += 'Asegurate de que esto sea correcto'
}
} }
return true return true
@ -435,7 +470,7 @@ function guardar_deposito(values){
var data = new Object() var data = new Object()
data['cuenta'] = $$('lst_cuentas_banco').getValue() data['cuenta'] = $$('lst_cuentas_banco').getValue()
data['fecha'] = values.retiro_fecha data['fecha'] = values.deposito_fecha
data['hora'] = $$('time_deposito').getText() data['hora'] = $$('time_deposito').getText()
data['numero_operacion'] = values.deposito_referencia.trim() data['numero_operacion'] = values.deposito_referencia.trim()
data['forma_pago'] = $$('lst_deposito_forma_pago').getValue() data['forma_pago'] = $$('lst_deposito_forma_pago').getValue()
@ -443,6 +478,14 @@ function guardar_deposito(values){
data['retiro'] = 0.0 data['retiro'] = 0.0
data['descripcion'] = values.deposito_descripcion data['descripcion'] = values.deposito_descripcion
if(grid.count()){
var ids = new Object()
grid.data.each(function(obj){
ids[obj.id] = obj.importe.to_float()
})
data['ids'] = ids
}
webix.ajax().post('/movbanco', data, { webix.ajax().post('/movbanco', data, {
error:function(text, data, XmlHttpRequest){ error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico' msg = 'Ocurrio un error, consulta a soporte técnico'
@ -466,6 +509,7 @@ function guardar_deposito(values){
function cmd_guardar_deposito_click(){ function cmd_guardar_deposito_click(){
var form = $$('form_banco_deposito') var form = $$('form_banco_deposito')
var grid = $$('grid_cfdi_este_deposito')
if(!form.validate()) { if(!form.validate()) {
msg_error('Valores inválidos') msg_error('Valores inválidos')
@ -494,7 +538,11 @@ function cmd_guardar_deposito_click(){
} }
}) })
}else{ }else{
msg = 'Todos los datos son correctos.<br><br>¿Deseas agregar este depósito?' if(!msg_importe){
msg_importe = 'Se van a relacionar ' + grid.count() + ' facturas.'
}
msg = 'Todos los datos son correctos.<br><br>' + msg_importe + '<br><br>'
msg += '¿Deseas agregar este depósito?'
webix.confirm({ webix.confirm({
title: 'Guardar depósito', title: 'Guardar depósito',
ok: 'Si', ok: 'Si',
@ -509,3 +557,48 @@ function cmd_guardar_deposito_click(){
}) })
} }
} }
function cancelar_movimiento(id){
var grid = $$('grid_cuentabanco')
webix.ajax().del('/movbanco', {id: id}, function(text, xml, xhr){
if(xhr.status == 200){
get_estado_cuenta()
get_saldo_cuenta()
msg_sucess('Movimiento cancelado correctamente')
}else{
msg_error('No se pudo eliminar')
}
})
}
function cmd_cancelar_movimiento_click(){
var grid = $$('grid_cuentabanco')
var row = grid.getSelectedItem()
if(row == undefined){
msg_error('Selecciona un movimiento')
return
}
if(row.descripcion == 'Saldo inicial'){
msg_error('No es posible eliminar el saldo inicial')
return
}
var msg = '¿Estás seguro de cancelar el movimiento seleccionado?'
msg += '<BR><BR>ESTA ACCIÓN NO SE PUEDE DESHACER<BR><BR>'
webix.confirm({
title:'Cancelar Movimiento',
ok:'Si',
cancel:'No',
type:'confirm-error',
text:msg,
callback:function(result){
if (result){
cancelar_movimiento(row['id'])
}
}
})
}

View File

@ -17,10 +17,17 @@ var toolbar_filtro_cuenta = [
{view: 'daterangepicker', id: 'filtro_cuenta_fechas', label: 'Fechas', {view: 'daterangepicker', id: 'filtro_cuenta_fechas', label: 'Fechas',
labelAlign: 'right', width: 300}, labelAlign: 'right', width: 300},
{}, {},
]
var toolbar_movimientos_banco = [
{view: 'button', id: 'cmd_agregar_retiro', label: 'Retiro', {view: 'button', id: 'cmd_agregar_retiro', label: 'Retiro',
type: 'iconButton', autowidth: true, icon: 'minus'}, type: 'iconButton', autowidth: true, icon: 'minus'},
{view: 'button', id: 'cmd_agregar_deposito', label: 'Depósito', {view: 'button', id: 'cmd_agregar_deposito', label: 'Depósito',
type: 'iconButton', autowidth: true, icon: 'plus'}, type: 'iconButton', autowidth: true, icon: 'plus'},
{},
{view: 'button', id: 'cmd_cancelar_movimiento', label: 'Cancelar',
type: 'iconButton', autowidth: true, icon: 'ban'},
] ]
@ -250,6 +257,7 @@ var multi_bancos = {
{id: 'banco_home', rows:[ {id: 'banco_home', rows:[
{view: 'toolbar', elements: toolbar_banco}, {view: 'toolbar', elements: toolbar_banco},
{view: 'toolbar', elements: toolbar_filtro_cuenta}, {view: 'toolbar', elements: toolbar_filtro_cuenta},
{view: 'toolbar', elements: toolbar_movimientos_banco},
grid_cuentabanco, grid_cuentabanco,
]}, ]},
{id: 'banco_retiro', rows: [form_banco_retiro]}, {id: 'banco_retiro', rows: [form_banco_retiro]},