forked from elmau/empresa-libre
394 lines
10 KiB
JavaScript
394 lines
10 KiB
JavaScript
var query = []
|
|
var msg = ''
|
|
|
|
|
|
var tickets_controllers = {
|
|
init: function(){
|
|
$$('cmd_nuevo_ticket').attachEvent('onItemClick', cmd_nuevo_ticket_click)
|
|
$$('cmd_generar_ticket').attachEvent('onItemClick', cmd_generar_ticket_click)
|
|
$$('cmd_cerrar_ticket').attachEvent('onItemClick', cmd_cerrar_ticket_click)
|
|
$$('cmd_cancelar_ticket').attachEvent('onItemClick', cmd_cancelar_ticket_click)
|
|
$$('tsearch_product_key').attachEvent('onKeyPress', tsearch_product_key_press)
|
|
$$('grid_tdetails').attachEvent('onItemClick', grid_ticket_details_click)
|
|
$$('grid_tdetails').attachEvent('onBeforeEditStop', grid_tickets_details_before_edit_stop)
|
|
$$('gt_productos_found').attachEvent('onValueSuggest', gt_productos_found_click)
|
|
$$('filter_year_ticket').attachEvent('onChange', filter_year_ticket_change)
|
|
$$('filter_month_ticket').attachEvent('onChange', filter_month_ticket_change)
|
|
|
|
webix.extend($$('grid_tickets'), webix.ProgressBar)
|
|
}
|
|
}
|
|
|
|
|
|
function current_dates_tickets(){
|
|
var fy = $$('filter_year_ticket')
|
|
var fm = $$('filter_month_ticket')
|
|
var d = new Date()
|
|
|
|
fy.blockEvent()
|
|
fm.blockEvent()
|
|
|
|
fm.setValue(d.getMonth() + 1)
|
|
webix.ajax().sync().get('/values/filteryearsticket', function(text, data){
|
|
var values = data.json()
|
|
fy.getList().parse(values)
|
|
fy.setValue(d.getFullYear())
|
|
})
|
|
|
|
fy.unblockEvent()
|
|
fm.unblockEvent()
|
|
}
|
|
|
|
|
|
function get_tickets(filters){
|
|
if(filters == undefined){
|
|
filters = {'opt': 'today'}
|
|
}
|
|
|
|
var grid = $$('grid_tickets')
|
|
grid.showProgress({type: 'icon'})
|
|
|
|
webix.ajax().get('/tickets', filters, {
|
|
error: function(text, data, xhr) {
|
|
msg_error('Error al consultar')
|
|
},
|
|
success: function(text, data, xhr) {
|
|
var values = data.json();
|
|
grid.clearAll();
|
|
if (values.ok){
|
|
grid.parse(values.rows, 'json')
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
function filter_year_ticket_change(nv, ov){
|
|
var fm = $$('filter_month_ticket')
|
|
filters = {'opt': 'yearmonth','year': nv, 'month': fm.getValue()}
|
|
get_tickets(filters)
|
|
}
|
|
|
|
|
|
function filter_month_ticket_change(nv, ov){
|
|
var fy = $$('filter_year_ticket')
|
|
filters = {'opt': 'yearmonth','year': fy.getValue(), 'month': nv}
|
|
get_tickets(filters)
|
|
}
|
|
|
|
|
|
function configuracion_inicial_ticket(){
|
|
current_dates_tickets()
|
|
get_tickets()
|
|
}
|
|
|
|
|
|
function configuracion_inicial_nuevo_ticket(){
|
|
var grid = $$('grid_tdetails')
|
|
|
|
webix.ajax().sync().get('/values/taxes', function(text, data){
|
|
var values = data.json()
|
|
table_taxes.clear()
|
|
table_taxes.insert(values)
|
|
})
|
|
get_forma_pago('lst_ticket_forma_pago')
|
|
grid.clearAll()
|
|
table_pt.clear()
|
|
table_totals.clear()
|
|
}
|
|
|
|
|
|
function cmd_nuevo_ticket_click(){
|
|
configuracion_inicial_nuevo_ticket()
|
|
$$('multi_tickets').setValue('tickets_new')
|
|
}
|
|
|
|
|
|
function validar_ticket(){
|
|
var grid = $$('grid_tdetails')
|
|
|
|
if(!grid.count()){
|
|
webix.UIManager.setFocus('tsearch_product_key')
|
|
msg = 'Agrega al menos un producto'
|
|
msg_error(msg)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
|
|
function guardar_ticket(values){
|
|
var gd = $$('grid_tdetails')
|
|
var grid = $$('grid_tickets')
|
|
|
|
var rows = gd.data.getRange()
|
|
for (i = 0; i < rows.length; i++) {
|
|
delete rows[i]['delete']
|
|
delete rows[i]['clave']
|
|
delete rows[i]['clave_sat']
|
|
delete rows[i]['unidad']
|
|
delete rows[i]['importe']
|
|
rows[i]['valor_unitario'] = parseFloat(rows[i]['valor_unitario'])
|
|
rows[i]['descuento'] = parseFloat(rows[i]['descuento'])
|
|
}
|
|
|
|
var data = new Object()
|
|
data['opt'] = 'add'
|
|
data['productos'] = rows
|
|
data['forma_pago'] = values.forma_pago
|
|
|
|
webix.ajax().sync().post('tickets', data, {
|
|
error:function(text, data, XmlHttpRequest){
|
|
msg = 'Ocurrio un error, consulta a soporte técnico'
|
|
msg_error(msg)
|
|
},
|
|
success:function(text, data, XmlHttpRequest){
|
|
values = data.json();
|
|
if(values.ok){
|
|
msg_ok('Ticket generado correctamente')
|
|
$$('form_new_ticket').setValues({})
|
|
gd.clearAll()
|
|
grid.add(values.row)
|
|
$$('multi_tickets').setValue('tickets_home')
|
|
}else{
|
|
msg_error(values.msg)
|
|
}
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
|
|
function cmd_generar_ticket_click(){
|
|
var form = this.getFormView();
|
|
|
|
if(!form.validate()) {
|
|
msg_error('Valores inválidos')
|
|
return
|
|
}
|
|
|
|
var values = form.getValues()
|
|
if(!validar_ticket()){
|
|
return
|
|
}
|
|
|
|
msg = '¿Todos los datos son correctos?<BR><BR>'
|
|
msg += '¿Estás seguro de generar este Ticket?'
|
|
|
|
webix.confirm({
|
|
title: 'Generar Ticket',
|
|
ok: 'Si',
|
|
cancel: 'No',
|
|
type: 'confirm-error',
|
|
text: msg,
|
|
callback:function(result){
|
|
if(result){
|
|
guardar_ticket(values)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
function cmd_cerrar_ticket_click(){
|
|
$$('multi_tickets').setValue('tickets_home')
|
|
}
|
|
|
|
function calcular_precio_con_impuestos(precio, taxes){
|
|
var precio_final = precio
|
|
|
|
for(var tax of taxes){
|
|
impuesto = table_taxes.findOne({'id': tax.tax})
|
|
if(impuesto.tipo == 'E'){
|
|
continue
|
|
}
|
|
var base = precio
|
|
if(impuesto.tipo == 'R'){
|
|
base = (precio * -1).round(DECIMALES)
|
|
}
|
|
precio_final += (impuesto.tasa * base).round(DECIMALES)
|
|
}
|
|
|
|
return precio_final
|
|
}
|
|
|
|
|
|
function agregar_producto(values){
|
|
var taxes = values.taxes
|
|
var producto = values.row
|
|
var form = $$('form_new_ticket')
|
|
var grid = $$('grid_tdetails')
|
|
var row = grid.getItem(producto.id)
|
|
var precio_final = 0.0
|
|
|
|
if(row == undefined){
|
|
producto['cantidad'] = 1
|
|
producto['valor_unitario'] = calcular_precio_con_impuestos(
|
|
parseFloat(producto['valor_unitario']), taxes)
|
|
producto['importe'] = producto['valor_unitario']
|
|
grid.add(producto)
|
|
}else{
|
|
producto['cantidad'] = parseFloat(row.cantidad) + 1
|
|
producto['descuento'] = parseFloat(row.descuento)
|
|
producto['valor_unitario'] = parseFloat(row.valor_unitario)
|
|
precio_final = producto['valor_unitario'] - producto['descuento']
|
|
producto['importe'] = (precio_final * producto['cantidad']).round(DECIMALES)
|
|
grid.updateItem(row.id, producto)
|
|
}
|
|
form.setValues({tsearch_product_key: '', tsearch_product_name: ''}, true)
|
|
}
|
|
|
|
|
|
function buscar_producto_key(key){
|
|
webix.ajax().get('/values/productokey', {'key': key}, {
|
|
error: function(text, data, xhr) {
|
|
msg_error('Error al consultar')
|
|
},
|
|
success: function(text, data, xhr){
|
|
var values = data.json()
|
|
if (values.ok){
|
|
agregar_producto(values)
|
|
} else {
|
|
msg = 'No se encontró la clave<BR><BR>' + key
|
|
msg_error(msg)
|
|
}
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
|
|
function tsearch_product_key_press(code, e){
|
|
var value = this.getValue()
|
|
if(code == 13 && value.trim().length > 0){
|
|
buscar_producto_key(value.trim())
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function grid_ticket_details_click(id, e, node){
|
|
if(id.column != 'delete'){
|
|
return
|
|
}
|
|
var grid = $$('grid_tdetails')
|
|
grid.remove(id.row)
|
|
}
|
|
|
|
|
|
function grid_tickets_details_before_edit_stop(state, editor){
|
|
var grid = $$('grid_tdetails')
|
|
var row = grid.getItem(editor.row)
|
|
|
|
if(editor.column == 'cantidad'){
|
|
var cantidad = parseFloat(state.value)
|
|
if(isNaN(cantidad)){
|
|
msg = 'La cantidad debe ser un número'
|
|
msg_error(msg)
|
|
grid.blockEvent()
|
|
state.value = state.old
|
|
grid.editCancel()
|
|
grid.unblockEvent()
|
|
return true
|
|
}
|
|
var valor_unitario = parseFloat(row['valor_unitario'])
|
|
var descuento = parseFloat(row['descuento'])
|
|
}
|
|
|
|
if(editor.column == 'valor_unitario'){
|
|
var valor_unitario = parseFloat(state.value)
|
|
if(isNaN(valor_unitario)){
|
|
msg = 'El valor unitario debe ser un número'
|
|
msg_error(msg)
|
|
grid.blockEvent()
|
|
state.value = state.old
|
|
grid.editCancel()
|
|
grid.unblockEvent()
|
|
return true
|
|
}
|
|
var cantidad = parseFloat(row['cantidad'])
|
|
var descuento = parseFloat(row['descuento'])
|
|
}
|
|
|
|
if(editor.column == 'descuento'){
|
|
var descuento = parseFloat(state.value)
|
|
if(isNaN(descuento)){
|
|
msg = 'El descuento debe ser un número'
|
|
msg_error(msg)
|
|
grid.blockEvent()
|
|
state.value = state.old
|
|
grid.editCancel()
|
|
grid.unblockEvent()
|
|
return true
|
|
}
|
|
var cantidad = parseFloat(row['cantidad'])
|
|
var valor_unitario = parseFloat(row['valor_unitario'])
|
|
}
|
|
|
|
var precio_final = valor_unitario - descuento
|
|
row['importe'] = (cantidad * precio_final).round(DECIMALES)
|
|
|
|
grid.refresh()
|
|
}
|
|
|
|
|
|
function gt_productos_found_click(obj){
|
|
buscar_producto_key(obj.clave)
|
|
}
|
|
|
|
|
|
function cancel_ticket(id){
|
|
var grid = $$('grid_tickets')
|
|
var data = new Object()
|
|
data['opt'] = 'cancel'
|
|
data['id'] = id
|
|
|
|
webix.ajax().sync().post('tickets', data, {
|
|
error:function(text, data, XmlHttpRequest){
|
|
msg = 'Ocurrio un error, consulta a soporte técnico'
|
|
msg_error(msg)
|
|
},
|
|
success:function(text, data, XmlHttpRequest){
|
|
values = data.json();
|
|
if(values.ok){
|
|
grid.updateItem(id, values.row)
|
|
msg_ok(values.msg)
|
|
}else{
|
|
msg_error(values.msg)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
function cmd_cancelar_ticket_click(){
|
|
var grid = $$('grid_tickets')
|
|
|
|
if(grid.count() == 0){
|
|
return
|
|
}
|
|
|
|
var row = grid.getSelectedItem()
|
|
if (row == undefined){
|
|
msg_error('Selecciona un ticket')
|
|
return
|
|
}
|
|
|
|
msg = '¿Estás seguro de cancelar el siguiente Ticket?<BR><BR>'
|
|
msg += 'Folio: ' + row['folio']
|
|
msg += '<BR><BR>ESTA ACCIÓN NO SE PUEDE DESHACER'
|
|
webix.confirm({
|
|
title:'Cancelar Ticket',
|
|
ok:'Si',
|
|
cancel:'No',
|
|
type:'confirm-error',
|
|
text:msg,
|
|
callback:function(result){
|
|
if (result){
|
|
cancel_ticket(row['id'])
|
|
}
|
|
}
|
|
})
|
|
|
|
} |