Agregar depósitos
This commit is contained in:
parent
2e9dadf301
commit
9cb6dbf0b2
|
@ -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):
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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'])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
|
@ -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]},
|
||||
|
|
Loading…
Reference in New Issue