//~ 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 . var toolbar_partners = [ {view: 'button', id: 'cmd_new_partner', label: 'Nuevo', type: 'iconButton', autowidth: true, icon: 'user-plus'}, {view: 'button', id: 'cmd_edit_partner', label: 'Editar', type: 'iconButton', autowidth: true, icon: 'user'}, {view: 'button', id: 'cmd_delete_partner', label: 'Eliminar', type: 'iconButton', autowidth: true, icon: 'user-times'}, {}, //~ {view: 'button', id: 'cmd_partner_zero', label: 'Saldo 0', type: 'iconButton', //~ autowidth: true, icon: 'power-off', disabled: true}, ] var grid_partners_cols = [ {id: 'index', header:'#', css: 'right', footer: {content: 'countRows', colspan: 2, css: 'right'}}, {id: 'id', header: 'Clave', sort: 'int', css: 'right'}, {id: 'rfc', header: ['RFC', {content: 'textFilter'}], adjust: 'data', sort: 'string', footer: {text: 'Clientes y Proveedores', colspan: 2}}, {id: 'nombre', header: ['Razón Social', {content: 'textFilter'}], fillspace:true, sort: 'string'}, {id: 'saldo_cliente', header: ['Saldo Cliente', {content: 'numberFilter'}], width: 150, sort: 'int', format: webix.i18n.priceFormat, css: 'right'}, ] var grid_partners = { view: 'datatable', id: 'grid_partners', select: 'row', adjust: true, footer: true, resizeColumn: true, headermenu: true, columns: grid_partners_cols, pager: 'pager_clientes', //~ datafetch: 100, //~ loadahead: 100, //~ url: '/partners', ready:function(){ this.adjustColumn('index'); this.adjustColumn('id'); this.adjustColumn('rfc'); }, on:{ 'data->onStoreUpdated':function(){ this.data.each(function(obj, i){ obj.index = i+1; }) } }, } var persons_type = [ {id: 1, value: 'Física'}, {id: 2, value: 'Moral'}, {id: 3, value: 'Público'}, {id: 4, value: 'Extranjero'}, ] var controls_fiscales = [ {template: 'Tipo de Persona', type: 'section'}, {view: 'radio', id: 'tipo_persona', name: 'tipo_persona', label: 'Tipos: ', labelWidth: 150, value: 1, options: persons_type, required: true, invalidMessage: 'El Tipo de Persona es requerido'}, {template: 'Dirección Fiscal', type: 'section'}, {cols: [{view: 'text', id: 'rfc', name: 'rfc', label: 'RFC: ', width: 300, required: true, invalidMessage: 'RFC inválido', attributes: {maxlength: 13}}, {view: 'text', id: 'id_fiscal', name: 'id_fiscal', label: 'ID Fiscal: ', width: 400, required: false, attributes: {maxlength: 40}, hidden: true}, {}]}, {view: 'text', id: 'nombre', name: 'nombre', label: 'Razón Social: ', required: true, invalidMessage: 'La Razón Social es requerida'}, {view: 'text', id: 'calle', name: 'calle', label: 'Calle: '}, {cols: [{view: 'text', id: 'no_exterior', name: 'no_exterior', width: 300, label: 'No Exterior: '},{}]}, {cols: [{view: 'text', id: 'no_interior', name: 'no_interior', width: 300, label: 'No Interior: '},{}]}, {cols: [{view: 'search', id: 'codigo_postal', name: 'codigo_postal', width: 300, label: 'C.P.: ', attributes: {maxlength: 5}, required: true},{}]}, {view: 'text', id: 'colonia', name: 'colonia', label: 'Colonia: '}, {view: 'text', id: 'municipio', name: 'municipio', label: 'Municipio: '}, {view: 'text', id: 'estado', name: 'estado', label: 'Estado: '}, {view: 'text', id: 'pais', name: 'pais', label: 'País: ', value: 'México', readonly: true, placeholder: 'Usa solo tres letras de acuerdo al catalogo del SAT'}, {template: 'Condiciones Comerciales', type: 'section'}, {cols: [ {view: 'richselect', id: 'forma_pago', name: 'forma_pago', label: 'Forma de Pago: ', required: true, options: [], invalidMessage: 'La Forma de pago es requerida'}, {view: 'text', id: 'condicion_pago', name: 'condicion_pago', label: 'Condiciones de Pago: ', suggest: []}, ]}, {cols: [ {view: 'counter', id: 'dias_pago', name: 'dias_pago', label: 'Días de pago', step: 5, value: 0, min: 0, max: 365, tooltip: 'Permite calcular las fechas de pago', width: 250}, {view: 'checkbox', id: 'dias_habiles', name: 'dias_habiles', label: 'Hábiles: ', value: false, width: 180}, {}, ]}, {cols: [ {view: 'richselect', id: 'lst_uso_cfdi_socio', name: 'uso_cfdi_socio', label: 'Uso del CFDI', options: []}, {}, ]}, {template: 'Regimenes Fiscales', type: 'section'}, {cols: [ {view: 'list', id: 'lst_receptor_regimenes_fiscales', data: [], select: 'multiselect', width: 600, height: 125, required: true}, {}, ]} ] var controls_others = [ {view: 'checkbox', id: 'es_activo', name: 'es_activo', label: 'Activo: ', value: true, bottomLabel: '  Se recomienda solo desactivar y no eliminar'}, {view: 'text', id: 'commercial_name', name: 'nombre_comercial', label: 'Nombre Comercial: '}, {view: 'text', id: 'telefonos', name: 'telefonos', label: 'Teléfonos: '}, {view: 'text', id: 'web', name: 'web', label: 'Página Web: '}, {cols: [ {view: 'text', id: 'correo_facturas', name: 'correo_facturas', label: 'Correos para Facturas: ', tooltip: 'Separados por comas', bottomLabel: 'Uno o más correos electrónicos separados por comas'}, {view: 'text', id: 'partner_email_fp', name: 'partner_email_fp', label: 'Para Facturas de pago: ', tooltip: 'Separados por comas', bottomLabel: 'Uno o más correos electrónicos separados por comas'}, ]}, {cols: [ {view: 'checkbox', id: 'es_cliente', name: 'es_cliente', label: 'Es Cliente: ', value: true, width: 180}, {view: 'text', id: 'cuenta_cliente', name: 'cuenta_cliente', label: 'Cuenta Cliente: ', disabled: true}, {view: "currency", type: "text", id: 'partner_balance', width: 300, name: 'partner_balance', label: 'Saldo', labelWidth: 100, labelAlign: "right", required: true, inputAlign: "right", invalidMessage: "Captura un valor númerico", readonly: true}, ] }, {cols: [ {view: 'checkbox', id: 'es_proveedor', name: 'es_proveedor', label: 'Es Proveedor: ', value: false, width: 180}, {view: 'text', id: 'cuenta_proveedor', name: 'cuenta_proveedor', label: 'Cuenta Proveedor: ', disabled: true}, {}] }, {view: 'checkbox', name: 'es_ong', label: 'Es ONG: ', value: false}, {view: 'text', name: 'tags', label: 'Etiquetas', disabled: true, tooltip: 'Utiles para filtrados rápidos. Separa por comas.'}, {view: 'textarea' , height: 200, name: 'notas', label: 'Notas'}, ] var grid_partner_account_bank_cols = [ {id: 'id', header: 'ID', hidden: true}, {id: 'delete', header: '', width: 30, css: 'delete'}, {id: 'banco', header: 'Banco', fillspace: 1}, {id: 'cuenta', header: 'Cuenta', fillspace: 1}, {id: 'clabe', header: 'CLABE', fillspace: 1}, //~ {id: 'moneda', header: 'Moneda', fillspace: 1}, ] var grid_partner_account_bank = { view: 'datatable', id: 'grid_partner_account_bank', select: 'row', adjust: true, autoheight: true, columns: grid_partner_account_bank_cols, } var controls_partner_bank = [ {template: 'Agregar cuenta de banco', type: 'section'}, {view: 'form', id: 'form_partner_account_bank', rows: [ {cols: [ {view: 'richselect', id: 'lst_partner_bank', name: 'partner_bank', label: 'Banco: ', required: true, options: []}, {view: 'text', id: 'partner_account', name: 'partner_account', label: 'Cuenta: ', required: true}, {view: 'text', id: 'partner_clabe', name: 'partner_clabe', label: 'CLABE: ', required: true}, ]}, {minHeight: 10}, {cols: [{}, {view: 'button', id: 'cmd_partner_add_account_bank', maxWidth: 200, label: 'Agregar cuenta'}, {}]}, ], }, {minHeight: 20, maxHeight: 20}, {template: 'Cuentas de banco existentes', type: 'section'}, grid_partner_account_bank, {minHeight: 50}, ] var toolbar_contacts = [ {view: 'button', id: 'cmd_new_contact', label: 'Nuevo', type: 'iconButton', autowidth: true, icon: 'user-plus'}, ] var grid_contacts_cols = [ {id: 'index', header: '#', adjust:'data', css:'right', footer: {content: 'countRows'}}, {id: 'id', header: '', hidden: true}, {id: 'title', header: 'Título', adjust:'data', sort: 'string', footer: 'Contactos'}, {id: 'first_name', header: ['Nombre', {content: 'textFilter'}], adjust:'data', sort: 'string'}, {id: 'paterno', header: ['Apellido Paterno', {content: 'textFilter'}], fillspace:true, sort: 'string'}, {id: 'materno', header: ['Apellido Materno', {content: 'textFilter'}], fillspace:true, sort: 'string'}, {id: 'date_born', header: ['Fecha de Nacimiento'], adjust: 'data'}, ] var grid_contacts = { view: 'datatable', id: 'grid_contacts', select: 'row', adjust: true, height: 400, footer: true, resizeColumn: true, headermenu: true, columns: grid_contacts_cols, on:{ 'data->onStoreUpdated':function(){ this.data.each(function(obj, i){ obj.index = i + 1 }) } }, } var grid_email = { view: 'datatable', id: 'grid_email', select: 'row', adjust: true, height: 200, resizeColumn: true, columns: [ {id: 'id', header: '', hidden: true}, {id: 'type', header: 'Tipo', adjust:'data', sort: 'string'}, {id: 'email', header: ['Correo Electrónico'], fillspace:true, sort: 'string'}, ], } var grid_phone = { view: 'datatable', id: 'grid_phone', select: 'row', adjust: true, height: 200, resizeColumn: true, columns: [ {id: 'id', header: '', hidden: true}, {id: 'type', header: 'Tipo', adjust:'data', sort: 'string'}, {id: 'phone', header: ['Teléfono'], fillspace:true, sort: 'string'}, ], } var controls_contact = [ {template: 'Datos Generales', type: 'section' }, {cols: [ {view: 'combo', id: 'cbo_title_contact', name: 'cbo_title_contact', label: 'Título: ', width: 150}, {view: 'text', id: 'name_contact', name: 'name_contact', label: 'Nombre: '}, {view: 'text', id: 'paterno_contact', name: 'paterno_contact', label: 'A. Paterno: '}, {view: 'text', id: 'materno_contact', name: 'materno_contact', label: 'A. Materno: '}, {view: 'datepicker', id: 'date_contact', name: 'date_contact', label: 'Fecha de Nacimiento: ', format: '%d-%M-%Y'}, ]}, {template: 'Correos y Teléfonos', type: 'section' }, {cols: [ grid_email, {maxWidth: 10}, grid_phone, ]}, {}, { template:"", type: "section" }, { margin: 10, cols: [{}, {view: "button", id: "cmd_save_conctact", label: "Guardar Contacto" , type: "form", autowidth: true, align:"center"}, {view: "button", id: "cmd_cancel_contact", label: "Regresar" , type: "danger", autowidth: true, align:"center"}, {}] }, ] var form_contact = { type: 'space', cols: [{ view: 'form', id: 'form_contact', complexData: true, elements: controls_contact, elementsConfig: { labelPosition: 'top', }, autoheight: true, }] } var multi_contacts = { id: 'multi_contacts', animate: true, cells:[ {id: 'contacts_home', rows:[ {view: 'toolbar', elements: toolbar_contacts}, grid_contacts, ]}, {id: 'contacts_new', rows:[form_contact, {}]} ] }; var controls_partner = [ { view: 'tabview', id: 'tab_partner', tabbar: {ptions: ['Datos Fiscales', 'Otros Datos', 'Cuentas de Banco']}, animate: true, cells: [ {id: 'Datos Fiscales', rows: controls_fiscales}, {id: 'Otros Datos', rows: controls_others}, {id: 'Cuentas de Banco', rows: controls_partner_bank} ] }, {rows: [ { template:"", type: "section" }, { margin: 10, cols: [{}, {view: "button", id: "cmd_save_partner", label: "Guardar" , type: "form", autowidth: true, align:"center"}, {view: "button", id: "cmd_cancel_partner", label: "Cancelar" , type: "danger", autowidth: true, align:"center"}, {}] }, ]} ] var form_partner = { type: 'space', cols: [{ view: 'form', id: 'form_partner', complexData: true, scroll: true, elements: controls_partner, elementsConfig: { labelWidth: 150, labelAlign: 'right' }, rules: { nombre: function(value){ return value.trim() != '';}, rfc: validate_rfc, } }] } var pager_clientes = { view: "pager", id: "pager_clientes", template: "{common.prev()} {common.pages()} {common.next()}", size: 100, group: 10, } var multi_partners = { id: 'multi_partners', animate: true, cells:[ {id: 'partners_home', rows:[ {view: 'toolbar', elements: toolbar_partners}, grid_partners, pager_clientes, ]}, {id: 'partners_new', rows:[form_partner]} ] } var title_partners = 'Administración de Clientes y Proveedores' var app_partners = { id: 'app_partners', rows:[ {view: 'template', id: 'th_partner', type: 'header', template: title_partners}, multi_partners ] }