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)
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):

View File

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

View File

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

View File

@ -1,4 +1,6 @@
var msg = ''
var msg_importe = ''
var bancos_controllers = {
init: function(){
@ -7,6 +9,7 @@ var bancos_controllers = {
$$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click)
$$('cmd_guardar_retiro').attachEvent('onItemClick', cmd_guardar_retiro_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_deposito_importe').attachEvent('onChange', txt_deposito_importe_change)
$$('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){
show('Cuenta change')
}
@ -147,6 +164,7 @@ function cmd_agregar_retiro_click(){
function cmd_agregar_deposito_click(){
msg_importe = ''
get_bancos_forma_pago(false)
get_facturas_por_pagar()
$$('multi_bancos').setValue('banco_deposito')
@ -174,6 +192,13 @@ function validate_retiro(values){
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 seg = parseInt(horas[2])
var min = parseInt(horas[1])
@ -266,7 +291,6 @@ function cmd_guardar_retiro_click(){
function txt_retiro_importe_change(new_value, old_value){
showvar(new_value)
if(!isFinite(new_value)){
this.config.value = old_value
this.refresh()
@ -383,6 +407,13 @@ function validate_deposito(values){
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 seg = parseInt(horas[2])
var min = parseInt(horas[1])
@ -423,6 +454,10 @@ function validate_deposito(values){
msg_error(msg)
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
@ -435,7 +470,7 @@ function guardar_deposito(values){
var data = new Object()
data['cuenta'] = $$('lst_cuentas_banco').getValue()
data['fecha'] = values.retiro_fecha
data['fecha'] = values.deposito_fecha
data['hora'] = $$('time_deposito').getText()
data['numero_operacion'] = values.deposito_referencia.trim()
data['forma_pago'] = $$('lst_deposito_forma_pago').getValue()
@ -443,6 +478,14 @@ function guardar_deposito(values){
data['retiro'] = 0.0
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, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
@ -466,6 +509,7 @@ function guardar_deposito(values){
function cmd_guardar_deposito_click(){
var form = $$('form_banco_deposito')
var grid = $$('grid_cfdi_este_deposito')
if(!form.validate()) {
msg_error('Valores inválidos')
@ -494,7 +538,11 @@ function cmd_guardar_deposito_click(){
}
})
}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({
title: 'Guardar depósito',
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',
labelAlign: 'right', width: 300},
{},
]
var toolbar_movimientos_banco = [
{view: 'button', id: 'cmd_agregar_retiro', label: 'Retiro',
type: 'iconButton', autowidth: true, icon: 'minus'},
{view: 'button', id: 'cmd_agregar_deposito', label: 'Depósito',
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:[
{view: 'toolbar', elements: toolbar_banco},
{view: 'toolbar', elements: toolbar_filtro_cuenta},
{view: 'toolbar', elements: toolbar_movimientos_banco},
grid_cuentabanco,
]},
{id: 'banco_retiro', rows: [form_banco_retiro]},