empresa-libre/source/static/js/controller/bancos.js

893 lines
24 KiB
JavaScript

//~ Empresa Libre
//~ Copyright (C) 2016-2018 Mauricio Baeza Servin (web@correolibre.net)
//~
//~ This program is free software: you can redistribute it and/or modify
//~ it under the terms of the GNU General Public License as published by
//~ the Free Software Foundation, either version 3 of the License, or
//~ (at your option) any later version.
//~
//~ This program is distributed in the hope that it will be useful,
//~ but WITHOUT ANY WARRANTY; without even the implied warranty of
//~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//~ GNU General Public License for more details.
//~
//~ You should have received a copy of the GNU General Public License
//~ along with this program. If not, see <http://www.gnu.org/licenses/>.
var msg = ''
var msg_importe = ''
var bancos_controllers = {
init: function(){
$$('lst_cuentas_banco').attachEvent('onChange', lst_cuentas_banco_change)
$$('cmd_agregar_retiro').attachEvent('onItemClick', cmd_agregar_retiro_click)
$$('cmd_agregar_deposito').attachEvent('onItemClick', cmd_agregar_deposito_click)
$$('cmd_complemento_pago').attachEvent('onItemClick', cmd_complemento_pago_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)
$$('cmd_invoice_payed').attachEvent('onItemClick', cmd_invoice_payed_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)
$$('grid_cfdi_por_pagar').attachEvent('onAfterDrop', grid_cfdi_por_pagar_after_drop)
$$('grid_cfdi_este_deposito').attachEvent('onBeforeEditStop', grid_cfdi_este_deposito_before_edit_stop)
$$('grid_cfdi_este_deposito').attachEvent('onAfterEditStop', grid_cfdi_este_deposito_after_edit_stop)
$$('filter_cuenta_year').attachEvent('onChange', filter_cuenta_change)
$$('filter_cuenta_month').attachEvent('onChange', filter_cuenta_change)
$$('filter_cuenta_dates').attachEvent('onChange', filter_cuenta_dates_change)
$$('cmd_pay_stamp').attachEvent('onItemClick', cmd_pay_stamp_click)
$$('cmd_pay_cancel').attachEvent('onItemClick', cmd_pay_cancel_click)
$$('grid_cfdi_pay').attachEvent('onItemClick', grid_cfdi_pay_click)
set_year_month()
}
}
function set_year_month(){
var d = new Date()
var y = $$('filter_cuenta_year')
var m = $$('filter_cuenta_month')
webix.ajax().get('/values/cuentayears', {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
y.getList().parse(values)
y.blockEvent()
m.blockEvent()
y.setValue(d.getFullYear())
m.setValue(d.getMonth() + 1)
y.unblockEvent()
m.unblockEvent()
}
})
}
function get_cuentas_banco(){
var list = $$('lst_cuentas_banco')
webix.ajax().get('/cuentasbanco', {'tipo': 1}, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
list.getList().parse(values.rows)
list.blockEvent()
list.setValue(values.rows[0].id)
list.unblockEvent()
$$('txt_cuenta_moneda').setValue(values.moneda)
$$('txt_cuenta_saldo').setValue(values.saldo)
get_estado_cuenta()
}else{
enable('cmd_agregar_retiro', false)
enable('cmd_agregar_deposito', false)
}
}
})
}
function get_estado_cuenta(rango){
if(rango == undefined){
var filtro = {
cuenta: $$('lst_cuentas_banco').getValue(),
year: $$('filter_cuenta_year').getValue(),
mes: $$('filter_cuenta_month').getValue(),
}
}else{
var filtro = {
cuenta: $$('lst_cuentas_banco').getValue(),
fechas: rango,
}
}
var grid = $$('grid_cuentabanco')
webix.ajax().get('/movbanco', filtro, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
grid.clearAll()
if (values.ok){
grid.parse(values.rows, 'json')
}
}
})
}
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){
get_estado_cuenta()
}
function get_bancos_forma_pago(retiro){
webix.ajax().get('/values/formapago', {}, function(text, data){
var values = data.json()
if(retiro){
$$('lst_retiro_forma_pago').getList().parse(values)
}else{
$$('lst_deposito_forma_pago').getList().parse(values)
}
})
}
function get_facturas_por_pagar(){
var grid1 = $$('grid_cfdi_este_deposito')
var grid2 = $$('grid_cfdi_por_pagar')
var ids = []
grid1.data.each(function(obj){
ids.push(obj.id)
})
webix.ajax().get('/invoices', {'opt': 'porpagar', 'ids': ids}, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
grid2.clearAll()
if (values.ok){
grid2.parse(values.rows, 'json')
}
}
})
}
function cmd_agregar_retiro_click(){
get_bancos_forma_pago(true)
$$('multi_bancos').setValue('banco_retiro')
}
function cmd_agregar_deposito_click(){
msg_importe = ''
get_bancos_forma_pago(false)
get_facturas_por_pagar()
$$('multi_bancos').setValue('banco_deposito')
}
function validate_retiro(values){
var importe = values.retiro_importe.replace('$', '').replace(',', '').trim()
if(!importe){
msg = 'El importe es requerido'
msg_error(msg)
return false
}
importe = parseFloat(importe).round(2)
if(importe <= 0){
msg = 'El importe debe ser mayor a cero'
msg_error(msg)
return false
}
if(!values.retiro_descripcion.trim()){
msg = 'La descripción es requerida'
msg_error(msg)
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])
var horas = parseInt(horas[0])
if(horas > 23){
focus('time_retiro')
msg = 'Hora inválida'
msg_error(msg)
return false
}
if(min > 59){
focus('time_retiro')
msg = 'Hora inválida'
msg_error(msg)
return false
}
if(seg > 59){
focus('time_retiro')
msg = 'Hora inválida'
msg_error(msg)
return false
}
return true
}
function guardar_retiro(values){
var form = $$('form_banco_retiro')
var importe = get_float(values.retiro_importe)
var data = new Object()
data['cuenta'] = $$('lst_cuentas_banco').getValue()
data['fecha'] = values.retiro_fecha
data['hora'] = $$('time_retiro').getText()
data['numero_operacion'] = values.retiro_referencia.trim()
data['forma_pago'] = $$('lst_retiro_forma_pago').getValue()
data['retiro'] = importe
data['deposito'] = 0.0
data['descripcion'] = values.retiro_descripcion
webix.ajax().post('/movbanco', data, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
$$('txt_cuenta_saldo').setValue(values.saldo)
get_estado_cuenta()
$$('multi_bancos').setValue('banco_home')
form.setValues({})
}else{
msg_error(values.msg)
}
}
})
}
function cmd_guardar_retiro_click(){
var form = $$('form_banco_retiro')
if(!form.validate()) {
msg_error('Valores inválidos')
return
}
var values = form.getValues()
if(!validate_retiro(values)){
return
}
msg = 'Todos los datos son correctos.<br><br>¿Deseas agregar este retiro?'
webix.confirm({
title: 'Guardar Retiro',
ok: 'Si',
cancel: 'No',
type: 'confirm-error',
text: msg,
callback:function(result){
if(result){
guardar_retiro(values)
}
}
})
}
function txt_retiro_importe_change(new_value, old_value){
if(!isFinite(new_value)){
this.config.value = old_value
this.refresh()
}
}
function txt_deposito_importe_change(new_value, old_value){
if(!isFinite(new_value)){
this.config.value = old_value
this.refresh()
}
}
function actualizar_deposito(grid){
grid.sort("#fecha#", "desc", "date")
var suma = 0
var descripcion = ''
grid.data.each(function(obj){
descripcion += 'Pago de la factura: ' + obj.serie + obj.folio + ' del '
descripcion += 'cliente: ' + obj.cliente + '\n'
if(obj.importe == undefined){
obj.importe = obj.saldo
}
suma += obj.importe.to_float()
})
$$('txt_deposito_importe').setValue(suma)
$$('deposito_descripcion').setValue(descripcion.slice(0, -1))
grid.refresh()
}
function grid_cfdi_por_pagar_after_drop(context, native_event){
var grid = $$('grid_cfdi_este_deposito')
actualizar_deposito(grid)
}
function grid_cfdi_este_deposito_after_drop(context, native_event){
var grid = $$('grid_cfdi_este_deposito')
actualizar_deposito(grid)
}
function grid_cfdi_este_deposito_after_edit_stop(state, editor, ignoreUpdate){
var grid = $$('grid_cfdi_este_deposito')
var suma = 0
grid.data.each(function(obj){
suma += obj.importe.to_float()
})
$$('txt_deposito_importe').setValue(suma)
}
function grid_cfdi_este_deposito_before_edit_stop(state, editor){
var grid = $$('grid_cfdi_este_deposito')
var row = grid.getItem(editor.row)
if(editor.column == 'importe'){
var importe = parseFloat(state.value)
if(isNaN(importe)){
msg = 'El importe a pagar debe ser un número'
msg_error(msg)
grid.blockEvent()
state.value = state.old
grid.editCancel()
grid.unblockEvent()
return true
}
if(importe <= 0){
msg = 'El importe a pagar debe ser mayor a cero'
msg_error(msg)
grid.blockEvent()
state.value = state.old
grid.editCancel()
grid.unblockEvent()
return true
}
var saldo = row['saldo'].to_float()
if(importe > saldo){
msg = 'El importe a pagar no puede ser mayor al saldo de la factura'
msg_error(msg)
grid.blockEvent()
state.value = state.old
grid.editCancel()
grid.unblockEvent()
return true
}
}
}
function validate_deposito(values){
var grid = $$('grid_cfdi_este_deposito')
var importe = values.deposito_importe.to_float()
if(!importe){
msg = 'El importe es requerido'
msg_error(msg)
return false
}
if(importe <= 0){
msg = 'El importe debe ser mayor a cero'
msg_error(msg)
return false
}
if(!values.deposito_descripcion.trim()){
msg = 'La descripción es requerida'
msg_error(msg)
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])
var horas = parseInt(horas[0])
if(horas > 23){
focus('time_deposito')
msg = 'Hora inválida'
msg_error(msg)
return false
}
if(min > 59){
focus('time_deposito')
msg = 'Hora inválida'
msg_error(msg)
return false
}
if(seg > 59){
focus('time_deposito')
msg = 'Hora inválida'
msg_error(msg)
return false
}
if(grid.count()){
var suma = 0
grid.data.each(function(obj){
var tmp = obj.importe.to_float()
if(tmp <= 0){
msg = 'El importe de la factura: ' + obj.serie + obj.folio + ' no puede ser menor a cero'
msg_error(msg)
return false
}
suma += tmp
})
if(suma > importe){
msg = 'La suma del pago de facturas, no puede ser mayor al deposito'
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
}
function guardar_deposito(values){
var form = $$('form_banco_deposito')
var grid = $$('grid_cfdi_este_deposito')
var data = new Object()
data['cuenta'] = $$('lst_cuentas_banco').getValue()
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()
data['deposito'] = values.deposito_importe.to_float()
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'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
$$('txt_cuenta_saldo').setValue(values.saldo)
get_estado_cuenta()
$$('multi_bancos').setValue('banco_home')
form.setValues({})
grid.clearAll()
}else{
msg_error(values.msg)
}
}
})
}
function cmd_guardar_deposito_click(){
var form = $$('form_banco_deposito')
var grid = $$('grid_cfdi_este_deposito')
if(!form.validate()) {
msg_error('Valores inválidos')
return
}
var values = form.getValues()
if(!validate_deposito(values)){
return
}
if(!grid.count()){
msg = 'Todos los datos son correctos<br>br>'
msg = 'El depósito no tiene facturas relacionadas<br><br>¿Estás '
msg += ' seguro de guardar del depósito sin facturas relacionadas?'
webix.confirm({
title: 'Guardar depósito',
ok: 'Si',
cancel: 'No',
type: 'confirm-error',
text: msg,
callback:function(result){
if(result){
guardar_deposito(values)
}
}
})
}else{
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',
cancel: 'No',
type: 'confirm-error',
text: msg,
callback:function(result){
if(result){
guardar_deposito(values)
}
}
})
}
}
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_ok('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'])
}
}
})
}
function set_invoices_payed(rows){
var ids = []
for(var row of rows){
ids.push(row.id)
}
webix.ajax().post('/invoices', {opt: 'invoicepayed', ids: ids}, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
msg = 'Facturas marcadas pagadas correctamente'
$$('grid_cfdi_por_pagar').remove(values.rows)
msg_ok(msg)
}else{
msg_error(values.msg)
}
}
})
}
function cmd_invoice_payed_click(){
var rows = $$('grid_cfdi_por_pagar').getSelectedItem(true)
if (rows.length == 0){
msg_error('Selecciona al menos una factura por pagar')
return
}
msg = '¿Estás seguro de marcar como pagadas las facturas seleccionadas?<BR><BR>'
msg += 'No se relacionarán con ningún depósito.<BR><BR>ESTA ACCIÓN NO SE PUEDE DESHACER'
webix.confirm({
title: 'Facturas Pagadas',
ok: 'Si',
cancel: 'No',
type: 'confirm-error',
text: msg,
callback: function(result){
if (result){
set_invoices_payed(rows)
}
}
})
}
function filter_cuenta_change(){
get_estado_cuenta()
}
function filter_cuenta_dates_change(range){
if(range.start != null && range.end != null){
get_estado_cuenta(range)
}
}
function set_data_pay(row){
var form = $$('form_bank_pay')
var dt = row.fecha.split(' ')
var grid = $$('grid_pay_related')
grid.clearAll()
set_way_payment('pay_way_payment')
var wp = table_waypayment.findOne({'value': row.way_payment})
form.setValues({
id_mov: row.id,
pay_date: dt[0],
pay_time: dt[1],
pay_reference: row.numero_operacion,
pay_way_payment: wp.id,
pay_import: row.deposito,
pay_description: row.descripcion
})
webix.ajax().get('/invoicepay', {'opt': 'related', 'id': row.id}, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
grid.parse(values.rows, 'json')
}
}
})
$$('grid_cfdi_pay').clearAll()
webix.ajax().get('/cfdipay', {'opt': 'related', 'id_mov': row.id}, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
var values = data.json()
if(values.ok){
$$('grid_cfdi_pay').parse(values.rows, 'json')
}
}
})
}
function cmd_complemento_pago_click(){
var grid = $$('grid_cuentabanco')
var row = grid.getSelectedItem()
if(row == undefined){
msg_error('Selecciona un movimiento de depósito')
return
}
if(row.descripcion == 'Saldo inicial'){
msg_error('No es posible generar un pago del Saldo Inicial')
return
}
if(row.deposito == 0){
msg_error('Selecciona un movimiento de depósito')
return
}
set_data_pay(row)
$$('multi_bancos').setValue('bank_pay')
}
function validate_cfdi_pay(form){
if(!form.validate()) {
msg_error('Valores inválidos')
return false
}
var grid = $$('grid_pay_related')
if(grid.count() == 0){
msg_error('El depósito no tiene facturas relacionadas')
return false
}
return true
}
function update_grid_cfdi_pay(row){
var g = $$('grid_cfdi_pay')
g.add(result.row)
if (g.count() == 1){
g.adjustColumn('index')
g.adjustColumn('serie')
g.adjustColumn('folio')
g.adjustColumn('fecha')
g.adjustColumn('cliente')
g.adjustColumn('xml')
g.adjustColumn('pdf')
g.adjustColumn('email')
}
}
function send_stamp_cfdi_pay(id_mov){
var g = $$('grid_cfdi_pay')
var data = {'opt': 'stamp', 'id_mov': id_mov}
webix.ajax().sync().post('cfdipay', data, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
result = data.json();
if(result.ok){
g.updateItem(result.id, result.row)
msg_ok(result.msg)
}else{
msg_error(result.msg)
}
}
})
}
function save_cfdi_pay(form){
var values = form.getValues()
var data = {'opt': 'new', 'id_mov': values.id_mov}
webix.ajax().sync().post('cfdipay', data, {
error:function(text, data, XmlHttpRequest){
msg = 'Ocurrio un error, consulta a soporte técnico'
msg_error(msg)
},
success:function(text, data, XmlHttpRequest){
result = data.json();
if(result.ok){
if(result.new){
msg_ok('Factura guardada correctamente<BR>Enviando a timbrar...')
update_grid_cfdi_pay(result.row)
}else{
msg_ok('Enviando a timbrar...')
}
send_stamp_cfdi_pay(values.id_mov)
}else{
msg_error(result.msg)
}
}
})
}
function cmd_pay_stamp_click(){
var form = $$('form_bank_pay')
var title = 'Timbrar Factura de Pago'
msg = '¿Estás seguro de enviar a timbrar este pago?'
if (!validate_cfdi_pay(form)){
return
}
webix.confirm({
title: title,
ok: 'Si',
cancel: 'No',
type: 'confirm-error',
text: msg,
callback:function(result){
if(result){
save_cfdi_pay(form)
}
}
})
}
function cmd_pay_cancel_click(){
}
function grid_cfdi_pay_click(id, e, node){
var row = this.getItem(id)
if(id.column == 'xml'){
location = '/doc/xmlpago/' + row.id
}
//~ }else if(id.column == 'pdf'){
//~ get_pdf(row.id)
//~ }else if(id.column == 'email'){
//~ enviar_correo(row)
//~ }
}