//~ Empresa Libre
//~ Copyright (C) 2016-2018  Mauricio Baeza Servin (publico@cuates.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 grid_cfdi_cliente_cols = [
    {id: 'index', header: '#', adjust: 'data', css: 'right',
        footer: {content: 'countRows', colspan: 3, css: 'right'}},
    {id: "id", header:"ID", hidden:true},
    {id: "serie", header: ["Serie", {content: "selectFilter"}], adjust: "header",
        sort:"string"},
    {id: 'folio', header: ['Folio'], adjust: 'data', sort: 'int',
        css: 'right'},
    {id: 'uuid', header: ['UUID', {content: 'textFilter'}], width: 250,
        sort: 'string'},
    {id: "fecha", header: ["Fecha y Hora"], width: 150, sort: 'string'},
    {id: "tipo_comprobante", header: ["Tipo", {content: "selectFilter"}],
        adjust: 'header', sort: 'string'},
    {id: "estatus", header: ["Estatus", {content: "selectFilter"}],
        adjust: "header", sort:"string"},
    {id: 'total_mn', header: ['Total M.N.'], width: 150,
        sort: 'int', format: webix.i18n.priceFormat, css: 'right'},
]


var grid_relacionados_cols = [
    {id: 'index', header: '#', adjust: 'data', css: 'right'},
    {id: "id", header:"ID", hidden:true},
    {id: "serie", header: "Serie", adjust: "header", sort:"string"},
    {id: 'folio', header: 'Folio', adjust: 'data', sort: 'int', css: 'right'},
    {id: 'uuid', header: 'UUID', width: 250, sort: 'string'},
    {id: "fecha", header: "Fecha y Hora", width: 150, sort: 'date'},
    {id: "tipo_comprobante", header: "Tipo", adjust: 'header', sort: 'string'},
    {id: "estatus", header: "Estatus", adjust: "header", sort:"string"},
    {id: 'total_mn', header: ['Total M.N.'], width: 150,
        sort: 'int', format: webix.i18n.priceFormat, css: 'right'},
]


var grid_cfdi_cliente = {
    view: 'datatable',
    id: 'grid_cfdi_cliente',
    select: 'row',
    autoConfig: false,
    adjust: true,
    height: 300,
    resizeColumn: true,
    headermenu: true,
    drag: true,
    columns: grid_cfdi_cliente_cols,
    on:{
        'data->onStoreUpdated':function(){
            this.data.each(function(obj, i){
                obj.index = i + 1
            })
        }
    }
}


var grid_relacionados = {
    view: 'datatable',
    id: 'grid_relacionados',
    select: 'row',
    autoConfig: false,
    adjust: true,
    height: 200,
    resizeColumn: true,
    headermenu: true,
    drag: true,
    columns: grid_relacionados_cols,
    on:{
        'data->onStoreUpdated':function(){
            this.data.each(function(obj, i){
                obj.index = i + 1
            })
        }
    }
}


var body_cfdi_relacionados = {rows: [
    {cols: [
        {view: 'label', id: 'lbl_cfdi_title', label: 'Cliente: ',
            autowidth: true},
        {view: 'label', id: 'lbl_cfdi_cliente', label: '', align: 'left'}]},
    {cols: [
        {view: 'richselect', id: 'lst_tipo_relacion', label: 'Tipo de Relación',
            labelWidth: 140, required: true, options: []},
        {view: 'checkbox', id: 'chk_relacionados_anticipo',
            labelRight: 'Solo Anticipos', width: 200, disabled: true}]},
    {minHeight: 10, maxHeight: 10},
    {cols: [
        {view: 'richselect', id: 'filter_cfdi_year', label: 'Año', width: 100,
            labelAlign: 'center', labelPosition: 'top', options: []},
        {view: 'richselect', id: 'filter_cfdi_month', label: 'Mes', width: 125,
            labelAlign: 'center', labelPosition: 'top', options: months},
        {view: 'text', id: 'filter_cfdi_folio', label: 'Folio', width: 125,
            labelAlign: 'center', labelPosition: 'top'},
        {view: 'text', id: 'filter_cfdi_uuid', label: 'UUID',
            labelAlign: 'center', labelPosition: 'top'},
        {view: 'icon', id: 'cmd_filter_relacionados', icon: 'filter'},
    ]},
    grid_cfdi_cliente,
    {minHeight: 10, maxHeight: 10},
    {view: 'label', label: 'CFDI Relacionados'},
    grid_relacionados,
    {minHeight: 10, maxHeight: 10},
    {cols: [{},
        {view: 'button', id: 'cmd_guardar_relacionados', label: 'Relacionar'},
        {view: 'button', id: 'cmd_limpiar_relacionados', label: 'Limpiar'},
        {}]},
    {minHeight: 15, maxHeight: 15},
]}


var ui_invoice = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_cfdi_relacionados',
            autoheight: true,
            width: 850,
            modal: true,
            position: 'center',
            head: {view: 'toolbar',
                elements: [
                    {view: 'label', label: 'CFDI Relacionados'},
                    {view: 'icon', icon: 'times-circle',
                        click: '$$("win_cfdi_relacionados").close()'},
                ]
            },
            body: body_cfdi_relacionados,
        })
        $$('cmd_guardar_relacionados').attachEvent('onItemClick', cmd_guardar_relacionados_click)
        $$('cmd_limpiar_relacionados').attachEvent('onItemClick', cmd_limpiar_relacionados_click)
        $$('cmd_filter_relacionados').attachEvent('onItemClick', cmd_filter_relacionados_click)
        $$('lst_tipo_relacion').attachEvent('onChange', lst_tipo_relacion_change)
        $$('filter_cfdi_month').attachEvent('onChange', filter_cfdi_month_change)
        $$('filter_cfdi_month').attachEvent('onChange', filter_cfdi_month_change)
}}


var body_cfdi_notes = {rows: [
    {minHeight: 5, maxHeight: 5},
    {view: 'textarea', id: 'invoice_notes', name: 'invoice_notes', height: 300,
        placeholder: 'Captura las notas.'},
    {minHeight: 5, maxHeight: 5},
    {cols: [{}, {view: 'button', id: 'cmd_invoice_save_note', autowidth: true,
        label: 'Guardar y Cerrar', type: 'iconButton', hotkey: 'Ctrl+enter'},
        {}]},
    {minHeight: 5, maxHeight: 5},
],}


var win_invoice_notes = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_invoice_notes',
            height: 400,
            width: 500,
            modal: true,
            position: 'center',
            head: 'Notas',
            body: body_cfdi_notes,
        })
        $$('cmd_invoice_save_note').attachEvent('onItemClick', cmd_invoice_save_note_click)
    }
}


var toolbar_invoices = [
    {view: "button", id: "cmd_new_invoice", label: "Nueva", type: "iconButton",
        autowidth: true, icon: "plus"},
    {view: "button", id: "cmd_refacturar", label: "Refacturar", type: "iconButton",
        autowidth: true, icon: "pencil"},
    {},
    {view: 'button', id: 'cmd_admin_invoice_notes', label: 'Notas',
        disabled: true, type: 'iconButton', autowidth: true, icon: 'commenting-o'},
    {view: 'button', id: 'cmd_invoice_report_pdf', label: 'Reporte',
        type: 'iconButton', autowidth: true, icon: 'file-pdf-o'},
    {view: 'button', id: 'cmd_invoice_report_xls', label: 'Reporte',
        type: 'iconButton', autowidth: true, icon: 'table'},
    {},
    {view: "button", id: "cmd_delete_invoice", label: "Eliminar", type: "iconButton",
        autowidth: true, icon: "minus"},
]


var toolbar_invoices_util = [
    {view: 'button', id: 'cmd_invoice_timbrar', label: 'Timbrar',
        type: 'iconButton', autowidth: true, icon: 'ticket'},
    {view: 'button', id: 'cmd_invoice_sat', label: 'SAT',
        type: 'iconButton', autowidth: true, icon: 'check-circle'},
    {view: 'button', id: 'cmd_invoice_verify_sat', label: 'SAT',
        type: 'iconButton', autowidth: true, icon: 'firefox'},
    {},
    {view: 'button', id: 'cmd_invoice_ask_cancel', label: 'Cancelar',
        type: 'iconButton', autowidth: true, icon: 'ban'},
]


var toolbar_invoices_generate = {view: 'toolbar', elements: [{},
    {view: 'button', id: 'cmd_cfdi_notes', label: 'Notas',
        type: 'iconButton', autowidth: true, icon: 'commenting-o'},
    {view: 'button', id: 'cmd_cfdi_relacionados', label: 'CFDI Relacionados',
        type: 'iconButton', autowidth: true, icon: 'file-o'},
    {view: 'button', id: 'cmd_import_invoice', label: 'Importar',
        type: 'iconButton', autowidth: true, icon: 'upload'},
    {view: 'checkbox', id: 'chk_cfdi_anticipo', labelRight: 'Es Anticipo',
        labelWidth: 0, width: 100, hidden: true},
    {view: 'checkbox', id: 'chk_cfdi_donativo', labelRight: 'Es Donativo',
        labelWidth: 0, width: 100, hidden: true},
    {view: 'button', id: 'cmd_show_global_information', label: 'Global',
        type: 'iconButton', autowidth: true, hidden: false, icon: 'file-code-o'},
{}]}


var toolbar_invoices_filter = [
    {view: 'richselect', id: 'filter_year', label: 'Año', labelAlign: 'right',
        labelWidth: 50, width: 150, options: []},
    {view: 'richselect', id: 'filter_month', label: 'Mes', labelAlign: 'right',
        labelWidth: 50, width: 200, options: months},
    {view: 'richselect', id: 'filter_day', label: 'Día', labelAlign: 'right',
        labelWidth: 50, width: 125, options: days},
    {view: 'daterangepicker', id: 'filter_dates', label: 'Fechas',
        labelAlign: 'right', width: 300},
    {},
    {view: 'search', id: 'search_by', name: 'search_by', width: 200,
        placeholder: 'Captura al menos cuatro letras'},
]


var grid_invoices_cols = [
    {id: 'index', header: '#', adjust: 'data', css: 'right',
        footer: {content: 'countRows', colspan: 3, css: 'right'}},
    {id: "id", header:"ID", hidden:true},
    {id: 'serie', header: ["Serie", {content: "selectFilter"}], adjust: "data",
        sort: 'string', template: '{common.subrow()} #serie#'},
    {id: 'folio', header: ['Folio', {content: 'numberFilter'}], adjust: 'data',
        sort: 'int', css: 'right', footer: {text: 'Facturas', colspan: 3}},
    {id: "uuid", header: ["UUID", {content: "textFilter"}], adjust: "data",
        sort:"string", hidden:true},
    {id: "fecha", header: ["Fecha y Hora"],
        adjust: "data", sort: "string"},
    {id: "tipo_comprobante", header: ["Tipo", {content: "selectFilter"}],
        adjust: 'header', sort: 'string'},
    {id: "estatus", header: ["Estatus", {content: "selectFilter"}],
        adjust: "data", sort:"string"},
    {id: "paid", header: ["Pagada", {content: "selectFilter"}],
        adjust: "data", sort:"string"},
    {id: 'metodo_pago', header: ['Método de Pago', {content: 'selectFilter'}],
        adjust: 'data', hidden: true},
    {id: 'total', header: ['Total', {content: 'numberFilter'}],
        width: 125, sort: 'int', format: webix.i18n.priceFormat, css: 'right',
        hidden: true},
    {id: 'currency', header: ['Moneda', {content: 'selectFilter'}],
        adjust: 'data', sort: 'string', hidden: true},
    {id: 'total_mn', header: ['Total M.N.', {content: 'numberFilter'}],
        width: 150, sort: 'int', format: webix.i18n.priceFormat, css: 'right',
        footer: {content: 'summTimbrada', css: 'right'}},
    {id: 'cliente', header: ['Razón Social', {content: 'selectFilter'}],
        fillspace: true, sort: 'string', footer: {text: '$ 0.00', colspan: 2}},
    {id: 'xml', header: 'XML', adjust: 'data', template: get_icon('xml')},
    {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')},
    {id: 'html', header: 'HTML', adjust: 'data', template: get_icon('html')},
    {id: 'ods', header: 'ODS', adjust: 'data', template: get_icon('table')},
    {id: 'zip', header: 'ZIP', adjust: 'data', template: get_icon('zip')},
    {id: 'email', header: '@', adjust: 'data', template: get_icon('email')}
]


var sv_grid_invoices = {
    borderless: true,
    view: 'datatable',
    headerRowHeight: 25,
    columns: [
        {id: 'id_product', header: 'id_product', hidden: true},
        {id: "clave", header:{text: 'Clave', css: 'center'}, width: 100,
            adjust: 'data'},
        {id: "clave_sat", hidden: true},
        {id: "descripcion", header:{text: 'Descripción', css: 'center'},
            fillspace: true},
        {id: "pedimento", header: 'Pedimento', hidden: true},
        {id: "id_student", header: 'ID_Alumno', hidden: true},
        {id: 'student', header: 'Alumno', hidden: true, width: 150},
        {id: "unidad", header:{text: 'Unidad', css: 'center'}, width: 100},
        {id: 'cantidad', header: {text: 'Cantidad', css: 'center'}, width: 100,
            format: webix.i18n.numberFormat, css: 'right'},
        {id: "valor_unitario", header:{text: 'Valor Unitario', css: 'center'},
            width: 100, format: webix.i18n.priceFormat, css: 'right'},
        {id: 'descuento', header:{text: 'Descuento', css: 'center'},
            width: 80, format: webix.i18n.priceFormat, css: 'right'},
        {id: 'precio_final', hidden: true, header: 'precio_final', width: 80,
            format: webix.i18n.priceFormat, css: 'right'},
        {id: "importe", header:{text: 'Importe', css: 'center'}, width: 150,
            format: webix.i18n.priceFormat, css: 'right'},
        ],
    scrollX: false,
    autoheight: true,
    css: 'table_sg',
}

var grid_invoices = {
    view: 'datatable',
    id: 'grid_invoices',
    subview: sv_grid_invoices,
    select: 'row',
    multiselect: true,
    adjust: true,
    footer: true,
    resizeColumn: true,
    headermenu: true,
    columns: grid_invoices_cols,
    scheme:{
        $change:function(item){
            if (item.estatus == 'Cancelada'){
                item.$css = 'cancel'
            }
        }
    },
    on:{
        'data->onStoreUpdated':function(){
            this.data.each(function(obj, i){
                obj.index = i + 1
            })
        }
    },
}


var grid_details_cols = [
    {id: 'id_product', header: 'id_product', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: "clave", header:{text: 'Clave', css: 'center'}, width: 100,
        adjust: 'data'},
    {id: "clave_sat", hidden: true},
    {id: "descripcion", header:{text: 'Descripción', css: 'center'},
        fillspace: true, editor: 'popup'},
    {id: "pedimento", header: 'Pedimento', editor: 'text', hidden: true},
    {id: "id_student", header: 'ID_Alumno', hidden: true},
    {id: 'student', header: 'Alumno', hidden: true, width: 150},
    {id: "unidad", header:{text: 'Unidad', css: 'center'}, width: 100,
        editor: 'select', options: 'values/unidades'},
    {id: 'cantidad', header: {text: 'Cantidad', css: 'center'}, width: 100,
        format: webix.i18n.numberFormat, css: 'right', editor: 'text'},
    {id: "valor_unitario", header:{text: 'Valor Unitario', css: 'center'},
        width: 100, format: format_currency, css: 'right', editor: 'text'},
    {id: 'descuento', header:{text: 'Descuento', css: 'center'},
        width: 100, format: format_currency, css: 'right', editor: 'text'},
    {id: 'precio_final', hidden: true, header: 'precio_final', width: 80,
        format: webix.i18n.priceFormat, css: 'right'},
    {id: "importe", header:{text: 'Importe', css: 'center'}, width: 150,
        format: webix.i18n.priceFormat, css: 'right'},
    {id: "inventario", hidden: true},
    {id: "existencia", hidden: true},
]


var grid_details = {
    view: 'datatable',
    id: 'grid_details',
    select: 'row',
    adjust: true,
    autoheight: true,
    editable: true,
    columns: grid_details_cols,
    data: [],
    fixedRowHeight: false,
}


var grid_totals_cols = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'concepto', header: 'Concepto', width: 250,
        footer: {text: 'TOTAL', css:'right_footer'}, css:'right'},
    {id: 'importe', header: 'Importe', width: 150,
        footer: {content: 'summColumn', css:'right_footer'},
        format: webix.i18n.priceFormat, css:'right'},
]


var grid_totals = {
    view: 'datatable',
    id: 'grid_totals',
    select: false,
    width: 400,
    header: false,
    footer: true,
    autoheight: true,
    columns: grid_totals_cols,
    data: [{id: 1, concepto: 'SubTotal', importe: 0}],
}


var suggest_partners = {
    view: 'gridsuggest',
    id: 'grid_clients_found',
    name: 'grid_clients_found',
    body: {
        autoConfig: false,
        scroll: true,
        autoheight: false,
        yCount: 15,
        header: false,
        columns: [
            {id: 'id', hidden: true},
            {id: 'nombre', adjust: 'data'},
            {id: 'rfc', adjust: 'data'},
            {id: 'forma_pago', hidden: true},
            {id: 'uso_cfdi', hidden: true},
            {id: 'codigo_postal', hidden: true},
        ],
        dataFeed:function(text){
            if (text.length > 2){
                this.load('/values/client?name=' + text)
            }else{
                this.hide()
            }
        }
    }
}


var suggest_products = {
    view: 'gridsuggest',
    id: 'grid_products_found',
    name: 'grid_products_found',
    body: {
        autoConfig: false,
        scroll: true,
        autoheight: false,
        yCount: 12,
        header: true,
        columns: [
            {id: 'id', hidden: true},
            {id: 'clave', header: 'Clave', adjust: 'data'},
            {id: 'descripcion', header: 'Descripción', width: 500},
            {id: 'unidad', header: 'Unidad', adjust: 'data'},
            {id: 'valor_unitario', header: 'Valor Unitario', adjust: 'data',
                format: webix.i18n.priceFormat}
        ],
        dataFeed:function(text){
            if (text.length > 2){
                this.load('/values/product?name=' + text)
            }else{
                this.hide()
            }
        }
    }
}


var suggest_students = {
    view: 'gridsuggest',
    id: 'grid_students_found',
    name: 'grid_students_found',
    body: {
        autoConfig: false,
        header: false,
        columns: [
            {id: 'id', hidden: true},
            {id: 'nombre', adjust: 'data'},
            {id: 'paterno', adjust: 'data'},
            {id: 'materno', adjust: 'data'},
            {id: 'rfc', adjust: 'data'},
        ],
        dataFeed:function(text){
            if (text.length > 2){
                this.load('/values/student?name=' + text)
            }else{
                this.hide()
            }
        }
    }
}


var body_comprobante = {rows: [
    {view: 'datepicker', id: 'date_invoice', label: 'Fecha', format: '%d-%F-%Y',
        required: true, invalidMessage: 'Selecciona una fecha', hidden: true
        },
    {cols: [
        {
            view: 'richselect',
            id: 'lst_tipo_comprobante',
            label: 'Tipo',
            labelPosition: 'top',
            required: true,
            value: 'I',
            options: [
                {id: 'I', value: 'Ingreso'},
                {id: 'E', value: 'Egreso'},
                {id: 'T', value: 'Traslado'}
            ]
        },
        {
            view: 'richselect',
            id: 'lst_serie',
            label: 'Serie',
            labelPosition: 'top',
            options: [],
        },
    ]},
    {view: 'text', id: 'txt_folio_custom', label: 'Folio: ', labelWidth: 50,
        hidden: true, placeholder: 'Solo números'},
    {view: 'richselect', id: 'lst_uso_cfdi', name: 'uso_cfdi', required: true,
        labelPosition: 'top', label: 'Uso del CFDI', options: []},
]}


var opt_metodo_pago = [
    {id: 'PUE', value: '[PUE] Pago en una sola exhibición'},
    {id: 'PPD', value: '[PPD] Pago en parcialidades o diferido'}
]


var body_opciones = {rows: [
    {view: 'richselect', id: 'lst_metodo_pago', label: 'Método de Pago',
        labelPosition: 'top', options: opt_metodo_pago, value: 'PUE',
        required: true},
    {view: 'richselect', id: 'lst_forma_pago', name: 'forma_pago',
        label: 'Forma de Pago', labelPosition: 'top', required: true,
        options: []},
    {view: 'text', id: 'txt_condicion_pago', label: 'Condiciones de Pago',
        labelPosition: 'top', suggest: []},
]}


var body_moneda = {cols: [
        {view: 'richselect', id: 'lst_moneda', label: 'Nombre',
            labelPosition: 'top', required: true, options: []},
        {view: 'text', type: 'text', id: 'txt_tipo_cambio', value: '1.00',
            label: 'Tipo de Cambio', labelPosition: 'top', required: true,
            invalidMessage: 'Captura un valor númerico', inputAlign: 'right',
            readonly: true}
]}


var body_divisas = {cols: [
    {view: 'radio', id: 'opt_divisas', name: 'opt_divisas',
        options: ['Ninguna', 'Compra', 'Venta']},
]}


var body_regimen_fiscal = {
    view: 'richselect',
    id: 'lst_regimen_fiscal',
    required: true,
    options: []
}


var body_students = {rows:[
    {view: 'search', id: 'search_student',
        name: "search_student", label: "por Nombre o RFC",
        labelPosition:'top', suggest: suggest_students,
        placeholder:'Captura al menos tres letras'},
]}


var txt_total_cant = {rows:[{
    view: 'text',
    id: 'txt_total_cant',
    readonly: true,
    width: 300,
    label: 'Total cantidades: ',
    labelWidth: 150,
    inputAlign: 'center'
}, {}]}


var controls_generate = [
    {minHeight: 10, maxHeight: 10},
    toolbar_invoices_generate,
    {minHeight: 10, maxHeight: 10},
    {cols: [ {rows:[
        {view: 'fieldset', label: 'Buscar Cliente', body: {rows: [
            {cols: [
                {view:"search", id:"search_client_id", name:"search_client_id",
                    label:"por Clave", labelPosition:'top', maxWidth:200,
                    placeholder:'Captura la clave'},
                {view: 'search', id: 'search_client_name',
                    name: 'search_client_name', label: 'por Nombre o RFC',
                    labelPosition: 'top', suggest: suggest_partners,
                    placeholder: 'Captura al menos tres letras'},
            ]},
            {cols: [{
                view: 'label', id: 'lbl_client_title',
                    name: "lbl_client_title", label: 'Seleccionado: ',
                    autowidth:true},
                {view: 'label', id: 'lbl_client', name: 'lbl_client',
                    label: 'Ninguno'},
            ]},
            {cols: [{
                view: 'richselect', id: 'lst_invoice_client_regimen',
                    label: 'Regimen Fiscal: ', labelWidth: 150, options: []}
            ]}
        ]}},
        {view: 'fieldset', label: 'Buscar Producto', body: {rows: [
            {cols: [
                {view: "search", id: "search_product_id",
                    name: "search_product_id", label: "por Clave",
                    labelPosition:'top', maxWidth:200,
                    placeholder:'Presiona ENTER para buscar'},
                {view: "search", id: "search_product_name",
                    name: "search_product_name", label: "por Descripción o Clave",
                    labelPosition:'top', suggest: suggest_products,
                    placeholder:'Captura al menos tres letras'},
            ]},
        ]}},
        {view: 'fieldset', id: 'fs_students', label: 'Buscar Alumno',
            body: body_students},
    ]},
    {maxWidth: 10},
    {maxWidth: 300, rows: [
        {view: 'fieldset', label: 'Comprobante', body: body_comprobante},
        {view: 'fieldset', label: 'Opciones de Pago', body: body_opciones},
        {view: 'fieldset', id: 'fs_moneda', label: 'Moneda', body: body_moneda},
        {view: 'fieldset', id: 'fs_divisas', label: 'Divisas - Tipo de Operación', body: body_divisas},
        {view: 'fieldset', id: 'fs_regimen_fiscal', label: 'Regimen Fiscal',
            body: body_regimen_fiscal},
        ]}
    ]},
    {view: 'label', label: 'Detalle', height: 30, align: 'left'},
    grid_details,
    {minHeight: 15, maxHeight: 15},
    {cols: [{}, txt_total_cant, grid_totals]},
    {minHeight: 15, maxHeight: 15},
    {margin: 20, cols: [{},
        {view: "button", id: "cmd_timbrar", label: "Timbrar", icon: 'ticket',
            type: 'iconButton', autowidth: true, align:"center"},
        {view: "button", id: 'cmd_prefactura', label: "PreFactura",
            type: 'iconButton', autowidth: true, align: 'center', icon: 'file-o'},
        {}]
    },
    {rows: [
        {template:"", type: "section" },
        {margin: 10, cols: [{},
            {view: 'button', id: 'cmd_close_invoice', label: 'Cancelar',
                type: 'danger', autowidth: true, align: 'center'}
            ]
        },
    ]}
]


var toolbar_preinvoices = [
    {view: 'button', id: 'cmd_facturar_preinvoice', label: 'Facturar',
        type: 'iconButton', autowidth: true, icon: 'pencil'},
    {view: 'button', id: 'cmd_preinvoice_generate_delete', label: 'Facturar y Eliminar',
        type: 'iconButton', autowidth: true, icon: 'pencil', hidden: true},
    {},
    {view: "button", id: "cmd_delete_preinvoice", label: "Eliminar",
        type: "iconButton", autowidth: true, icon: "minus"},
]


var toolbar_prefilter = [
    {view: 'richselect', id: 'prefilter_year', label: 'Año', labelAlign: 'right',
        labelWidth: 50, width: 150, options: []},
    {view: 'richselect', id: 'prefilter_month', label: 'Mes', labelAlign: 'right',
        labelWidth: 50, width: 200, options: months},
]


var grid_preinvoices_cols = [
    {id: "id", header:"ID", hidden:true},
    {id: "folio", header: ["Folio", {content: "numberFilter"}], adjust: "data",
        sort:"int", css: "cell_right"},
    {id: "fecha", header: ["Fecha y Hora"], adjust: "data", sort: "string",
        footer: 'Total'},
    {id: "tipo_comprobante", header: ["Tipo", {content: "selectFilter"}],
        adjust: 'header', sort: 'string'},
    {id: 'total_mn', header: ['Total M.N.'], width: 150, sort: 'int',
        format: webix.i18n.priceFormat, css: 'right',
        footer: {content: 'summColumn', css: 'right'}},
    {id: "cliente", header: ["Razón Social", {content: "selectFilter"}],
        fillspace:true, sort:"string"},
    {id: 'pdf', header: 'PDF', adjust: 'data', template: get_icon('pdf')},
    {id: 'email', header: '@', adjust: 'data', template: get_icon('email')}
]


var grid_preinvoices = {
    view: 'datatable',
    id: 'grid_preinvoices',
    select: 'row',
    adjust: true,
    footer: true,
    resizeColumn: true,
    autoheight: true,
    headermenu: true,
    columns: grid_preinvoices_cols
}


var controls_prefactura = [
    {view: 'toolbar', elements: toolbar_preinvoices},
    {view: 'toolbar', elements: toolbar_prefilter},
    grid_preinvoices,
]


var opt_tipo_proceso = [
    {id: 'Ordinario', value: 'Ordinario'},
    {id: 'Precampaña', value: 'Precampaña'},
    {id: 'Campaña', value: 'Campaña'},
]


var opt_tipo_comite = [
    {id: '', value: ''},
    {id: 'Ejecutivo Nacional', value: 'Ejecutivo Nacional'},
    {id: 'Ejecutivo Estatal', value: 'Ejecutivo Estatal'},
    {id: 'Directivo Estatal', value: 'Directivo Estatal'},
]


var opt_ine_ambito = [
    {id: '', value: ''},
    {id: 'Local', value: 'Local'},
    {id: 'Federal', value: 'Federal'},
]


var opt_clave_entidad = [
    {id: '', value: ''},
    {id: 'AGU', value: 'Aguascalientes'},
    {id: 'BCN', value: 'Baja California'},
    {id: 'BCS', value: 'Baja California Sur'},
    {id: 'CAM', value: 'Campeche'},
    {id: 'CHP', value: 'Chiapas'},
    {id: 'CHH', value: 'Chihuahua'},
    {id: 'COA', value: 'Coahuila'},
    {id: 'COL', value: 'Colima'},
    {id: 'CR1', value: 'Circunscripción 1'},
    {id: 'CR2', value: 'Circunscripción 2'},
    {id: 'CR3', value: 'Circunscripción 3'},
    {id: 'CR4', value: 'Circunscripción 4'},
    {id: 'CR5', value: 'Circunscripción 5'},
    {id: 'DIF', value: 'Ciudad de México'},
    {id: 'DUR', value: 'Durango'},
    {id: 'GUA', value: 'Guanajuato'},
    {id: 'GRO', value: 'Guerrero'},
    {id: 'HID', value: 'Hidalgo'},
    {id: 'JAL', value: 'Jalisco'},
    {id: 'MEX', value: 'Estado de México'},
    {id: 'MIC', value: 'Michoacán'},
    {id: 'MOR', value: 'Morelos'},
    {id: 'NAC', value: 'Nacional'},
    {id: 'NAY', value: 'Nayarit'},
    {id: 'NLE', value: 'Nuevo León'},
    {id: 'OAX', value: 'Oaxaca'},
    {id: 'PUE', value: 'Puebla'},
    {id: 'QUE', value: 'Querétaro'},
    {id: 'ROO', value: 'Quintana Roo'},
    {id: 'SLP', value: 'San Luis Potosí'},
    {id: 'SIN', value: 'Sinaloa'},
    {id: 'SON', value: 'Sonora'},
    {id: 'TAB', value: 'Tabasco'},
    {id: 'TAM', value: 'Tamaulipas'},
    {id: 'TLA', value: 'Tlaxcala'},
    {id: 'VER', value: 'Veracruz'},
    {id: 'YUC', value: 'Yucatán'},
    {id: 'ZAC', value: 'Zacatecas'},
]


var controls_ine = [
    {maxHeight: 15},
    {cols: [{maxWidth: 15},
        {view: 'checkbox', id: 'chk_cfdi_usar_ine', labelWidth: 0,
            labelRight: 'Usar el complemento INE'},
        {}]},
    {maxHeight: 10},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ine_tipo_proceso', labelWidth: 150,
            label: 'Tipo de Proceso', options: opt_tipo_proceso,
            value: 'Ordinario'},
        {}]},
    {maxHeight: 10},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ine_tipo_comite', labelWidth: 150,
            label: 'Tipo de Comite', options: opt_tipo_comite, value: ''},
        {}]},
    {maxHeight: 10},
    {cols: [{maxWidth: 15},
        {view: 'text', id: 'txt_ine_idcontabilidad', name: 'ine_idcontabilidad',
            label: 'ID de Contabilidad: ', labelWidth: 150},
        {}]},
    {maxHeight: 10},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ine_key_entidad', name: 'ine_key_entidad',
            label: 'Clave Entidad: ', labelWidth: 150, options: opt_clave_entidad},
        {}]},
    {maxHeight: 10},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ine_ambito', name: 'ine_ambito',
            label: 'Ámbito: ', labelWidth: 150, options: opt_ine_ambito},
        {}]},
]


var grid_cols_leyendas_fiscales = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'texto_leyenda', header: 'Leyenda', fillspace: 2},
    {id: 'norma', header: 'Norma', fillspace: 1},
    {id: 'disposicion_fiscal', header: 'Disposición Fiscal', fillspace: 1},
]


var grid_leyendas_fiscales = {
    view: 'datatable',
    id: 'grid_leyendas_fiscales',
    select: 'row',
    multiselect: true,
    adjust: true,
    autoheight: true,
    headermenu: true,
    columns: grid_cols_leyendas_fiscales,
}


var controls_leyendas_fiscales = [
    {maxHeight: 15},
    {cols: [{maxWidth: 15},
        {view: 'label', id: 'lbl_title', label: 'Selecciona las Leyendas Fiscales a integrar en esta factura'},
        {}]},
    {maxHeight: 15},
    grid_leyendas_fiscales,
]


var opt_ccp_transporte_internacional = [
    {id: 'Sí', value: 'Sí'},
    {id: 'No', value: 'No'},
]


var opt_ccp_regimen_aduanero = [
    {id: '', value: ''},
    {id: 'IMD', value: '[IMD] Definitivo de importación.'},
    {id: 'EXD', value: '[EXD] Definitivo de exportación.'},
    {id: 'ITR', value: '[ITR] Temporales de importación para retomar al extranjero en el mismo estado.'},
    {id: 'ITE', value: '[ITE] Temporales de importación para elaboración, transformación o reparación para empresas con programa IMMEX.'},
    {id: 'ETR', value: '[ETR] Temporales de exportación para retornar al país en el mismo estado.'},
    {id: 'ETE', value: '[ETE] Temporales de exportación para elaboración, transformación o reparación.'},
    {id: 'DFI', value: '[DFI] Depósito Fiscal.'},
    {id: 'RFE', value: '[RFE] Elaboración, transformación o reparación en recinto fiscalizado.'},
    {id: 'RFS', value: '[RFS] Recinto fiscalizado estratégico.'},
    {id: 'TRA', value: '[TRA] Tránsitos.'},
]


var opt_ccp_entrada_salida = [
    {id: '', value: ''},
    {id: 'Entrada', value: 'Entrada'},
    {id: 'Salida', value: 'Salida'},
]


var opt_ccp_pais_origen = [
    {id: '', value: ''},
]


var opt_ccp_via_entrada = [
    {id: '', value: ''},
    {id: '01', value: '[01] Autotransporte'},
    {id: '02', value: '[02] Marítimo'},
    {id: '03', value: '[03] Aéreo'},
    {id: '04', value: '[04] Ferroviario'},
]


var opt_ccp_ubicacion_polo = [
    {id: '', value: ''},
    {id: '01', value: '[01] Coatzacoalcos I'},
    {id: '02', value: '[02] Coatzacoalcos II'},
    {id: '03', value: '[03] Texistepec'},
    {id: '04', value: '[04] San Juan Evangelista'},
    {id: '05', value: '[05] Salina Cruz'},
    {id: '06', value: '[06] San Blas Atempa'},
]


var opt_ccp_registro_istmo = [
    {id: '', value: ''},
    {id: 'Si', value: 'Sí'},
]


var opt_ccp_origen_destino = [
    {id: 'Origen', value: 'Origen'},
    {id: 'Destino', value: 'Destino'},
]


var date_suggest = {
    type: 'calendar',
    body:{
        timepicker: true,
        icons: true,
    }
}


var opt_ccp_countries = [
    {id: 'MEX', value: 'México'},
]


var opt_ccp_carta_estados = [
    {id: 'AGU', value: 'Aguascalientes'},
    {id: 'BCN', value: 'Baja California'},
    {id: 'BCS', value: 'Baja California Sur'},
    {id: 'CAM', value: 'Campeche'},
    {id: 'CHP', value: 'Chiapas'},
    {id: 'CHH', value: 'Chihuahua'},
    {id: 'COA', value: 'Coahuila'},
    {id: 'COL', value: 'Colima'},
    {id: 'DIF', value: 'Ciudad de México'},
    {id: 'DUR', value: 'Durango'},
    {id: 'GUA', value: 'Guanajuato'},
    {id: 'GRO', value: 'Guerrero'},
    {id: 'HID', value: 'Hidalgo'},
    {id: 'JAL', value: 'Jalisco'},
    {id: 'MEX', value: 'Estado de México'},
    {id: 'MIC', value: 'Michoacán'},
    {id: 'MOR', value: 'Morelos'},
    {id: 'NAC', value: 'Nacional'},
    {id: 'NAY', value: 'Nayarit'},
    {id: 'NLE', value: 'Nuevo León'},
    {id: 'OAX', value: 'Oaxaca'},
    {id: 'PUE', value: 'Puebla'},
    {id: 'QUE', value: 'Querétaro'},
    {id: 'ROO', value: 'Quintana Roo'},
    {id: 'SLP', value: 'San Luis Potosí'},
    {id: 'SIN', value: 'Sinaloa'},
    {id: 'SON', value: 'Sonora'},
    {id: 'TAB', value: 'Tabasco'},
    {id: 'TAM', value: 'Tamaulipas'},
    {id: 'TLA', value: 'Tlaxcala'},
    {id: 'VER', value: 'Veracruz'},
    {id: 'YUC', value: 'Yucatán'},
    {id: 'ZAC', value: 'Zacatecas'},
]


var grid_cols_ccp_ubicaciones = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: 'TipoUbicacion', header: 'TipoUbicacion', editor: 'select', options: opt_ccp_origen_destino, fillspace: 1},
    //~ {id: 'IDUbicacion', header: 'IDUbicacion', hidden: true, editor: 'text', fillspace: 1},
    {id: 'RFCRemitenteDestinatario', header: 'RFC Rem/Des', editor: 'text', fillspace: 1},
    {id: 'NombreRemitenteDestinatario', header: 'Nombre Rem/Des', editor: 'text', fillspace: 1},
    //~ {id: 'NumRegIdTrib', header: 'NumRegIdTrib', hidden: true, editor: 'text', fillspace: 1},
    //~ {id: 'ResidenciaFiscal', header: 'ResidenciaFiscal', hidden: true, editor: 'text', fillspace: 1},
    //~ {id: 'NumEstacion', header: 'NumEstacion', hidden: true, editor: 'text', fillspace: 1},
    //~ {id: 'NombreEstacion', header: 'NombreEstacion', hidden: true, editor: 'text', fillspace: 1},
    //~ {id: 'NavegacionTrafico', header: 'NavegacionTrafico', hidden: true, editor: 'text', fillspace: 1},
    {id: 'FechaHoraSalidaLlegada', header: 'Fecha/Hora', editor: 'date', suggest: date_suggest, format: webix.Date.dateToStr("%D, %d-%M-%Y %h:%i"), footer: 'Total distancia:', fillspace: 1},
    //~ {id: 'TipoEstacion', header: 'TipoEstacion', hidden: true, editor: 'text', fillspace: 1},
    {id: 'DistanciaRecorrida', header: 'Distancia (KM)', editor: 'text', format: webix.i18n.numberFormat, css: 'right', footer: {content: 'summColumn', css: 'right'}, fillspace: 1},
    {id: 'Municipio', header: 'Municipio', editor: 'text', fillspace: 1},
    {id: 'Estado', header: 'Estado', editor: 'select', options: opt_ccp_carta_estados, fillspace: 1},
    {id: 'Pais', header: 'País', editor: 'select', options: opt_ccp_countries, fillspace: 1},
    {id: 'CodigoPostal', header: 'C.P.', editor: 'text', fillspace: 1},
]
//~ Calle
//~ NumeroExterior
//~ NumeroInterior
//~ Colonia
//~ Localidad
//~ Referencia


var grid_cols_ccp_mercancias = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: 'BienesTransp', header: 'Clave SAT', editor: 'text', fillspace: 1},
    //~ {id: 'ClaveSTCC', header: 'ClaveSTCC', editor: 'text', fillspace: 1},
    {id: 'Descripcion', header: 'Descripción', editor: 'text', fillspace: 1},
    {id: 'Cantidad', header: 'Cantidad', editor: 'text', format: webix.i18n.numberFormat, css: 'right', fillspace: 1},
    {id: 'ClaveUnidad', header: 'Unidad', editor: 'select', options: 'values/unitbykey', footer: 'Total peso:', fillspace: 1},
    //~ {id: 'Unidad', header: 'Unidad', editor: 'text', fillspace: 1},
    //~ {id: 'Dimensiones', header: 'Dimensiones', editor: 'text', fillspace: 1},
    //~ {id: 'MaterialPeligroso', header: 'MaterialPeligroso', editor: 'text', fillspace: 1},
    //~ {id: 'CveMaterialPeligroso', header: 'CveMaterialPeligroso', editor: 'text', fillspace: 1},
    //~ {id: 'Embalaje', header: 'Embalaje', editor: 'text', fillspace: 1},
    //~ {id: 'DescripEmbalaje', header: 'DescripEmbalaje', editor: 'text', fillspace: 1},
    //~ {id: 'SectorCOFEPRIS', header: 'SectorCOFEPRIS', editor: 'text', fillspace: 1},
    {id: 'PesoEnKg', header: 'Peso (Kg)', format: webix.i18n.numberFormat, css: 'right', editor: 'text', footer: {content: 'summColumn', css: 'right'}, fillspace: 1},
    //~ {id: 'ValorMercancia', header: 'Valor Mercancia', format: webix.i18n.priceFormat, css: 'right', footer: 'Total peso:', fillspace: 1},
    //~ {id: 'Moneda', header: 'Moneda', editor: 'text', fillspace: 1},
    //~ {id: 'FraccionArancelaria', header: 'FraccionArancelaria', editor: 'text', fillspace: 1},
]


var opt_ccp_tipo_permiso_sct = [
    {id: 'TPAF01', value: '[TPAF01] Autotransporte Federal de carga general.'},
    {id: 'TPAF02', value: '[TPAF02] Transporte privado de carga.'},
    {id: 'TPAF03', value: '[TPAF03] Autotransporte Federal de Carga Especializada de materiales y residuos peligrosos.'},
    {id: 'TPAF04', value: '[TPAF04] Transporte de automóviles sin rodar en vehículo tipo góndola.'},
    {id: 'TPAF05', value: '[TPAF05] Transporte de carga de gran peso y/o volumen de hasta 90 toneladas.'},
    {id: 'TPAF06', value: '[TPAF06] Transporte de carga especializada de gran peso y/o volumen de más 90 toneladas.'},
    {id: 'TPAF07', value: '[TPAF07] Transporte Privado de materiales y residuos peligrosos.'},
    {id: 'TPAF08', value: '[TPAF08] Autotransporte internacional de carga de largo recorrido.'},
    {id: 'TPAF09', value: '[TPAF09] Autotransporte internacional de carga especializada de materiales y residuos peligrosos de largo recorrido.'},
    {id: 'TPAF10', value: '[TPAF10] Autotransporte Federal de Carga General cuyo ámbito de aplicación comprende la franja fronteriza con Estados Unidos.'},
    {id: 'TPAF11', value: '[TPAF11] Autotransporte Federal de Carga Especializada cuyo ámbito de aplicación comprende la franja fronteriza con Estados Unidos.'},
    {id: 'TPAF12', value: '[TPAF12] Servicio auxiliar de arrastre en las vías generales de comunicación.'},
    {id: 'TPAF13', value: '[TPAF13] Servicio auxiliar de servicios de arrastre, arrastre y salvamento, y depósito de vehículos en las vías generales de comunicación.'},
    {id: 'TPAF14', value: '[TPAF14] Servicio de paquetería y mensajería en las vías generales de comunicación.'},
    {id: 'TPAF15', value: '[TPAF15] Transporte especial para el tránsito de grúas industriales con peso máximo de 90 toneladas.'},
    {id: 'TPAF16', value: '[TPAF16] Servicio federal para empresas arrendadoras servicio público federal.'},
    {id: 'TPAF17', value: '[TPAF17] Empresas trasladistas de vehículos nuevos.'},
    {id: 'TPAF18', value: '[TPAF18] Empresas fabricantes o distribuidoras de vehículos nuevos.'},
    {id: 'TPAF19', value: '[TPAF19] Autorización expresa para circular en los caminos y puentes de jurisdicción federal con configuraciones de tractocamión doblemente articulado.'},
    {id: 'TPAF20', value: '[TPAF20] Autotransporte Federal de Carga Especializada de fondos y valores.'},
    {id: 'TPTM01', value: '[TPTM01] Permiso temporal para navegación de cabotaje'},
    {id: 'TPTA01', value: '[TPTA01] Concesión y/o autorización para el servicio regular nacional y/o internacional para empresas mexicanas'},
    {id: 'TPTA02', value: '[TPTA02] Permiso para el servicio aéreo regular de empresas extranjeras'},
    {id: 'TPTA03', value: '[TPTA03] Permiso para el servicio nacional e internacional no regular de fletamento'},
    {id: 'TPTA04', value: '[TPTA04] Permiso para el servicio nacional e internacional no regular de taxi aéreo'},
    {id: 'TPXX00', value: '[TPXX00] Permiso no contemplado en el catálogo.'}
]


var opt_ccp_config_auto = [
    {id: '', value: ''},
    {id: 'VL', value: '[VL] Vehículo ligero de carga (2 llantas en el eje delantero y 2 llantas en el eje trasero)'},
    {id: 'C2', value: '[C2] Camión Unitario (2 llantas en el eje delantero y 4 llantas en el eje trasero)'},
    {id: 'C3', value: '[C3] Camión Unitario (2 llantas en el eje delantero y 6 o 8 llantas en los dos ejes traseros)'},
    {id: 'C2R2', value: '[C2R2] Camión-Remolque (6 llantas en el camión y 8 llantas en remolque)'},
    {id: 'C3R2', value: '[C3R2] Camión-Remolque (10 llantas en el camión y 8 llantas en remolque)'},
    {id: 'C2R3', value: '[C2R3] Camión-Remolque (6 llantas en el camión y 12 llantas en remolque)'},
    {id: 'C3R3', value: '[C3R3] Camión-Remolque (10 llantas en el camión y 12 llantas en remolque)'},
    {id: 'T2S1', value: '[T2S1] Tractocamión Articulado (6 llantas en el tractocamión, 4 llantas en el semirremolque)'},
    {id: 'T2S2', value: '[T2S2] Tractocamión Articulado (6 llantas en el tractocamión, 8 llantas en el semirremolque)'},
    {id: 'T2S3', value: '[T2S3] Tractocamión Articulado (6 llantas en el tractocamión, 12 llantas en el semirremolque)'},
    {id: 'T3S1', value: '[T3S1] Tractocamión Articulado (10 llantas en el tractocamión, 4 llantas en el semirremolque)'},
    {id: 'T3S2', value: '[T3S2] Tractocamión Articulado (10 llantas en el tractocamión, 8 llantas en el semirremolque)'},
    {id: 'T3S3', value: '[T3S3] Tractocamión Articulado (10 llantas en el tractocamión, 12 llantas en el semirremolque)'},
    {id: 'T2S1R2', value: '[T2S1R2] Tractocamión Semirremolque-Remolque (6 llantas en el tractocamión, 4 llantas en el semirremolque y 8 llantas en el remolque)'},
    {id: 'T2S2R2', value: '[T2S2R2] Tractocamión Semirremolque-Remolque (6 llantas en el tractocamión, 8 llantas en el semirremolque y 8 llantas en el remolque)'},
    {id: 'T2S1R3', value: '[T2S1R3] Tractocamión Semirremolque-Remolque (6 llantas en el tractocamión, 4 llantas en el semirremolque y 12 llantas en el remolque)'},
    {id: 'T3S1R2', value: '[T3S1R2] Tractocamión Semirremolque-Remolque (10 llantas en el tractocamión, 4 llantas en el semirremolque y 8 llantas en el remolque)'},
    {id: 'T3S1R3', value: '[T3S1R3] Tractocamión Semirremolque-Remolque (10 llantas en el tractocamión, 4 llantas en el semirremolque y 12 llantas en el remolque)'},
    {id: 'T3S2R2', value: '[T3S2R2] Tractocamión Semirremolque-Remolque (10 llantas en el tractocamión, 8 llantas en el semirremolque y 8 llantas en el remolque)'},
    {id: 'T3S2R3', value: '[T3S2R3] Tractocamión Semirremolque-Remolque (10 llantas en el tractocamión, 8 llantas en el semirremolque y 12 llantas en el remolque)'},
    {id: 'T3S2R4', value: '[T3S2R4] Tractocamión Semirremolque-Remolque (10 llantas en el tractocamión, 8 llantas en el semirremolque y 16 llantas en el remolque)'},
    {id: 'T2S2S2', value: '[T2S2S2] Tractocamión Semirremolque-Semirremolque (6 llantas en el tractocamión, 8 llantas en el semirremolque delantero y 8 llantas en el semirremolque trasero)'},
    {id: 'T3S2S2', value: '[T3S2S2] Tractocamión Semirremolque-Semirremolque (10 llantas en el tractocamión, 8 llantas en el semirremolque delantero y 8 llantas en el semirremolque trasero)'},
    {id: 'T3S3S2', value: '[T3S3S2] Tractocamión Semirremolque-Semirremolque (10 llantas en el tractocamión, 12 llantas en el semirremolque delantero y 8 llantas en el semirremolque trasero)'},
    {id: 'OTROEVGP', value: '[OTROEVGP] Especializado de carga Voluminosa y/o Gran Peso'},
    {id: 'OTROSG', value: '[OTROSG] Servicio de Grúas'},
    {id: 'GPLUTA', value: '[GPLUTA] Grúa de Pluma Tipo A'},
    {id: 'GPLUTB', value: '[GPLUTB] Grúa de Pluma Tipo B'},
    {id: 'GPLUTC', value: '[GPLUTC] Grúa de Pluma Tipo C'},
    {id: 'GPLUTD', value: '[GPLUTD] Grúa de Pluma Tipo D'},
    {id: 'GPLATA', value: '[GPLATA] Grúa de Plataforma Tipo A'},
    {id: 'GPLATB', value: '[GPLATB] Grúa de Plataforma Tipo B'},
    {id: 'GPLATC', value: '[GPLATC] Grúa de Plataforma Tipo C'},
    {id: 'GPLATD', value: '[GPLATD] Grúa de Plataforma Tipo D'},
]


var opt_ccp_tipo_remolque = [
    {id: '', value: ''},
    {id: 'CTR001', value: '[CTR001] Caballete'},
    {id: 'CTR002', value: '[CTR002] Caja'},
    {id: 'CTR003', value: '[CTR003] Caja Abierta'},
    {id: 'CTR004', value: '[CTR004] Caja Cerrada'},
    {id: 'CTR005', value: '[CTR005] Caja De Recolección Con Cargador Frontal'},
    {id: 'CTR006', value: '[CTR006] Caja Refrigerada'},
    {id: 'CTR007', value: '[CTR007] Caja Seca'},
    {id: 'CTR008', value: '[CTR008] Caja Transferencia'},
    {id: 'CTR009', value: '[CTR009] Cama Baja o Cuello Ganso'},
    {id: 'CTR010', value: '[CTR010] Chasis Portacontenedor'},
    {id: 'CTR011', value: '[CTR011] Convencional De Chasis'},
    {id: 'CTR012', value: '[CTR012] Equipo Especial'},
    {id: 'CTR013', value: '[CTR013] Estacas'},
    {id: 'CTR014', value: '[CTR014] Góndola Madrina'},
    {id: 'CTR015', value: '[CTR015] Grúa Industrial'},
    {id: 'CTR016', value: '[CTR016] Grúa'},
    {id: 'CTR017', value: '[CTR017] Integral'},
    {id: 'CTR018', value: '[CTR018] Jaula'},
    {id: 'CTR019', value: '[CTR019] Media Redila'},
    {id: 'CTR020', value: '[CTR020] Pallet o Celdillas'},
    {id: 'CTR021', value: '[CTR021] Plataforma'},
    {id: 'CTR022', value: '[CTR022] Plataforma Con Grúa'},
    {id: 'CTR023', value: '[CTR023] Plataforma Encortinada'},
    {id: 'CTR024', value: '[CTR024] Redilas'},
    {id: 'CTR025', value: '[CTR025] Refrigerador'},
    {id: 'CTR026', value: '[CTR026] Revolvedora'},
    {id: 'CTR027', value: '[CTR027] Semicaja'},
    {id: 'CTR028', value: '[CTR028] Tanque'},
    {id: 'CTR029', value: '[CTR029] Tolva'},
    {id: 'CTR031', value: '[CTR031] Volteo'},
    {id: 'CTR032', value: '[CTR032] Volteo Desmontable'},
]


//~ var opt_carta_aseguradoras = [
    //~ {id: 'General de Seguros', value: 'General de Seguros'},
    //~ {id: 'Qualitas', value: 'Qualitas'},
//~ ]


var grid_cols_ccp_autotransporte = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'PermSCT', header: 'PermSCT', editor: 'select', options: opt_ccp_tipo_permiso_sct, fillspace: 1},
    {id: 'NumPermisoSCT', header: 'NumPermisoSCT', editor: 'text', fillspace: 1},
    {id: 'ConfigVehicular', header: 'ConfigVehicular', editor: 'select', options: opt_ccp_config_auto, fillspace: 1},
    {id: 'PesoBrutoVehicular', header: 'PesoBrutoVehicular', editor: 'text', format: webix.i18n.numberFormat, css: 'right', fillspace: 1},
    {id: 'PlacaVM', header: 'Placa', editor: 'text', fillspace: 1},
    {id: 'AnioModeloVM', header: 'Modelo (Año)', editor: 'text', fillspace: 1},
    //~ {id: 'SubTipoRem', header: 'ST Remolque', editor: 'select', options: opt_ccp_tipo_remolque, fillspace: 1},
    //~ {id: 'Placa', header: 'Placa', editor: 'text', fillspace: 1},
]
var grid_cols_ccp_remolques = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: 'SubTipoRem', header: 'SubTipo Remolque', editor: 'select', options: opt_ccp_tipo_remolque, fillspace: 1},
    {id: 'Placa', header: 'Placa', editor: 'text', fillspace: 1},
]
var grid_cols_ccp_seguros = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'AseguraRespCivil', header: 'Aseguradora', editor: 'text', fillspace: 1},
    {id: 'PolizaRespCivil', header: 'Póliza', editor: 'text', fillspace: 1},
    //~ {id: 'AseguraMedAmbiente', header: 'AseguraMedAmbiente', editor: 'text', fillspace: 1},
    //~ {id: 'PolizaMedAmbiente', header: 'PolizaMedAmbiente', editor: 'text', fillspace: 1},
    //~ {id: 'AseguraCarga', header: 'AseguraCarga', editor: 'text', fillspace: 1},
    //~ {id: 'PolizaCarga', header: 'PolizaCarga', editor: 'text', fillspace: 1},
    //~ {id: 'PrimaSeguro', header: 'PrimaSeguro', editor: 'text', format: webix.i18n.numberFormat, css: 'right', fillspace: 1},
]


var opt_ccp_tipos_figura = [
    {id: '', value: ''},
    {id: '01', value: '[01] Operador'},
    {id: '02', value: '[02] Propietario'},
    {id: '03', value: '[03] Arrendador'},
    {id: '04', value: '[04] Notificado'},
]


var grid_cols_ccp_tipos_figuras = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'TipoFigura', header: 'TipoFigura', editor: 'select', options: opt_ccp_tipos_figura, fillspace: 1},
    {id: 'RFCFigura', header: 'RFCFigura', editor: 'text', fillspace: 1},
    {id: 'NumLicencia', header: 'NumLicencia', editor: 'text', fillspace: 1},
    {id: 'NombreFigura', header: 'NombreFigura', editor: 'text', fillspace: 1},
    //~ {id: 'NumRegIdTribFigura', header: 'NumRegIdTribFigura', editor: 'text', fillspace: 1},
    //~ {id: 'ResidenciaFiscalFigura', header: 'ResidenciaFiscalFigura', editor: 'text', fillspace: 1},
    //~ {id: 'Municipio', header: 'Municipio', editor: 'text', fillspace: 1},
    //~ {id: 'Estado', header: 'Estado', editor: 'select', options: opt_ccp_carta_estados, fillspace: 1},
    //~ {id: 'Pais', header: 'País', editor: 'select', options: opt_ccp_countries, fillspace: 1},
    //~ {id: 'CodigoPostal', header: 'C.P.', editor: 'text', fillspace: 1},
]


var grid_ccp_ubicaciones = {
    view: 'datatable',
    id: 'grid_ccp_ubicaciones',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    footer: true,
    columns: grid_cols_ccp_ubicaciones,
}


var grid_ccp_mercancias = {
    view: 'datatable',
    id: 'grid_ccp_mercancias',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    footer: true,
    columns: grid_cols_ccp_mercancias,
}


var grid_ccp_autotransporte = {
    view: 'datatable',
    id: 'grid_ccp_autotransporte',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ccp_autotransporte,
    data: [{id: 0}],
}
var grid_ccp_remolques = {
    view: 'datatable',
    id: 'grid_ccp_remolques',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ccp_remolques,
}
var grid_ccp_seguros = {
    view: 'datatable',
    id: 'grid_ccp_seguros',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ccp_seguros,
    data: [{id: 0}],
}


var grid_ccp_tipos_figuras = {
    view: 'datatable',
    id: 'grid_ccp_tipos_figuras',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ccp_tipos_figuras,
    data: [{id: 0}],
}


var body_ccp_ubicaciones = {rows:[
    {cols: [
        {view: 'button', id: 'cmd_ccp_agregar_ubicacion', label: 'Agregar Ubicación', icon: 'plus',
            type: 'iconButton', autowidth: true, align: 'center'},
        {}]},
    {maxHeight: 10},
    grid_ccp_ubicaciones,
]}


var body_ccp_mercancias = {rows:[
    {cols: [
        {view: 'button', id: 'cmd_ccp_add_product', label: 'Agregar Mercancía', icon: 'plus',
            type: 'iconButton', autowidth: true, align: 'center'},
        //~ {view: 'button', id: 'cmd_carta_copy_from_invoice', label: 'Copiar de CFDI', icon: 'copy',
            //~ type: 'iconButton', autowidth: true, align: 'center'},
        {},
        {view: 'richselect', id: 'lst_carta_UnidadPeso', label: 'Unidad de Peso: ',
            labelWidth: 110, maxWidth: 300, options: '/satunidadespeso?opt=active'}
        ]},
    {maxHeight: 10},
    grid_ccp_mercancias,
]}


var body_ccp_autotransporte = {rows:[
    grid_ccp_autotransporte,
    {minHeight: 10},
    {cols: [
        {view: 'button', id: 'cmd_ccp_agregar_remolque', label: 'Agregar Remolque', icon: 'plus',
            type: 'iconButton', autowidth: true, align: 'center'},
        {}]},
    {minHeight: 10},
    grid_ccp_remolques,
    {minHeight: 10},
    grid_ccp_seguros,
]}


var body_ccp_tipos_figuras = {rows:[
    grid_ccp_tipos_figuras,
]}


var body_cp_datos_generales = {rows:[
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_cp_TranspInternac', labelPosition: 'top',
            label: 'TranspInternac', options: opt_ccp_transporte_internacional,
            value: 'No', readonly: true},
        {view: 'richselect', id: 'lst_cp_RegimenAduanero', labelPosition: 'top',
            label: 'RegimenAduanero', options: opt_ccp_regimen_aduanero,
            value: '', disabled: true},
        {view: 'richselect', id: 'lst_cp_EntradaSalidaMerc', labelPosition: 'top',
            label: 'EntradaSalidaMerc', options: opt_ccp_entrada_salida,
            value: '', disabled: true},
        {view: 'richselect', id: 'lst_cp_PaisOrigenDestino', labelPosition: 'top',
            label: 'PaisOrigenDestino', options: opt_ccp_pais_origen,
            value: '', disabled: true},
        {view: 'richselect', id: 'lst_cp_ViaEntradaSalida', labelPosition: 'top',
            label: 'ViaEntradaSalida', options: opt_ccp_via_entrada,
            value: '', disabled: true},
        ]},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_cp_RegistroISTMO', labelPosition: 'top',
            label: 'RegistroISTMO', options: opt_ccp_registro_istmo,
            value: '', readonly: false},
        {view: 'richselect', id: 'lst_cp_UbicacionPoloOrigen', labelPosition: 'top',
            label: 'UbicacionPoloOrigen', options: opt_ccp_ubicacion_polo,
            value: '', disabled: true},
        {view: 'richselect', id: 'lst_cp_UbicacionPoloDestino', labelPosition: 'top',
            label: 'UbicacionPoloDestino', options: opt_ccp_ubicacion_polo,
            value: '', disabled: true},
        {}]},
]}


var controls_carta_porte = [
    {cols: [{maxWidth: 15},
        {view: 'checkbox', id: 'chk_cfdi_usar_cartaporte', labelWidth: 0,
            labelRight: 'Usar el complemento Carta Porte'}, {},
        {view: 'button', id: 'cmd_carta_import_json', label: 'Importar JSON',
            icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'},
        {view: 'button', id: 'cmd_carta_import_ods', label: 'Importar ODS',
            icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'},
        {maxWidth: 15}]},
    {view: 'fieldset', label: 'Datos generales', body: body_cp_datos_generales},
    {view: 'fieldset', label: 'Ubicaciones', body: body_ccp_ubicaciones},
    {view: 'fieldset', label: 'Mercancias', body: body_ccp_mercancias},
    {view: 'fieldset', label: 'Autotransporte', body: body_ccp_autotransporte},
    {view: 'fieldset', label: 'Tipos Figura', body: body_ccp_tipos_figuras},
]


var opt_ce_exportacion = [
    {id: '02', value: '[02] Definitiva con clave A1'},
    {id: '03', value: '[03] Temporal'},
    {id: '04', value: '[04] Definitiva con clave distinta a A1'},
]


var opt_ce_motivo_traslado = [
    {id: '', value: ''},
    {id: '01', value: '[01] Envío de mercancias facturadas con anterioridad'},
    {id: '02', value: '[02] Reubicación de mercancías propias'},
    {id: '03', value: '[03] Envío de mercancías objeto de contrato de consignación'},
    {id: '04', value: '[04] Envío de mercancías para posterior enajenación'},
    {id: '05', value: '[05] Envío de mercancías propiedad de terceros'},
    {id: '99', value: '[99] Otros'},
]


var opt_ce_clave_pedimento = [
    {id: 'A1', value: '[A1] Definitiva'},
]


var opt_ce_certificado_origen = [
    {id: '0', value: '[0] No funge'},
    {id: '1', value: '[1] Funge'},
]


var opt_ce_incoterm = [
    {id: 'CFR', value: '[CFR] Coste y flete (puerto de destino convenido)'},
    {id: 'CIF', value: '[CIF] Coste, seguro y flete (puerto de destino convenido)'},
    {id: 'CPT', value: '[CPT] Trasnporte pagado hasta el lugar de destino convenido'},
    {id: 'CIP', value: '[CIP] Trasnporte y seguro pagado hasta el lugar de destino convenido'},
    {id: 'DAP', value: '[DAP] Entregada en lugar'},
    {id: 'DDP', value: '[DDP] Entregada derechos pagados en lugar de destino convenido'},
    {id: 'DPU', value: '[DPU] Entregada y descargada en lugar acordado'},
    {id: 'EXW', value: '[EXW] En fábrica (lugar convenido)'},
    {id: 'FCA', value: '[FCA] Franco transportista (lugar designado)'},
    {id: 'FAS', value: '[FAS] Franco al costado del buque (puerto de carga convenido)'},
    {id: 'FOB', value: '[FOB] Franco a bordo (puerto de carga convenido)'},
]


var body_ce_datos_generales = {rows:[
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ce_exportacion', label: 'Exportación: ',
            value: '02', labelWidth: 130, minWidth: 400, options: opt_ce_exportacion},
        {view: 'richselect', id: 'lst_ce_motivo_traslado', label: 'Motivo Traslado: ',
            labelWidth: 130, minWidth: 500, options: opt_ce_motivo_traslado},
        {},
        {maxWidth: 15}]},
    {cols: [{maxWidth: 15},
        {view: 'richselect', id: 'lst_ce_clave_pedimento', label: 'Clave de Pedimento: ',
            value: 'A1', labelWidth: 130, minWidth: 400, maxWidth: 400, options: opt_ce_clave_pedimento},
        {view: 'richselect', id: 'lst_ce_certificado_origen', label: 'Certificado Origen: ',
            value: '0', labelWidth: 130, maxWidth: 300, options: opt_ce_certificado_origen},
        {view: 'text', id: 'txt_ce_numero_certificado', label: 'Nº Certificado:', labelWidth: 100},
        {maxWidth: 15}]},
    {cols: [{maxWidth: 15},
        {view: 'text', id: 'txt_ce_numero_exportador', label: 'Nº Exportador: ',
            labelWidth: 130, minWidth: 400, maxWidth: 500},
        {view: 'richselect', id: 'lst_ce_incoterm', label: 'Incoterm: ', value: 'CFR',
            labelWidth: 130, minWidth: 500, maxWidth: 500, options: opt_ce_incoterm},
        {view: 'text', id: 'txt_ce_observaciones', label: 'Observaciones:', labelWidth: 100},
        {maxWidth: 15}]},
    {cols: [{maxWidth: 15},
        {view: 'text', id: 'txt_ce_total_usd', label: 'Total USD: ',
            labelWidth: 130, minWidth: 400, inputAlign: 'right'},
        {view: 'text', id: 'txt_ce_tipo_cambio_usd', label: 'Tipo Cambio USD:', labelWidth: 130,
            inputAlign: 'right'},
        {},
        {view: 'button', id: 'cmd_ce_tipo_cambio', label: 'TC Banxico',
            type: 'iconButton', autowidth: true, icon: ''},
        {maxWidth: 15}]},
]}


var grid_cols_ce_emisor = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'Curp', header: 'Curp', editor: 'text', fillspace: 1},
    {id: 'Calle', header: 'Calle *', editor: 'text', fillspace: 1},
    {id: 'NumeroExterior', header: 'Numero Exterior', editor: 'text', fillspace: 1},
    {id: 'NumeroInterior', header: 'Número Interior', editor: 'text', fillspace: 1},
    {id: 'Colonia', header: 'Colonia', editor: 'text', fillspace: 1},
    {id: 'Municipio', header: 'Municipio', editor: 'text', fillspace: 1},
    {id: 'Estado', header: 'Estado *', editor: 'text', fillspace: 1},
    {id: 'Pais', header: 'País *', editor: 'text', fillspace: 1},
    {id: 'CodigoPostal', header: 'C.P. *', editor: 'text', fillspace: 1},
]


var grid_ce_emisor = {
    view: 'datatable',
    id: 'grid_ce_emisor',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ce_emisor,
    data: [{id: 0}],
}

var body_ce_emisor = {rows:[
    grid_ce_emisor
]}


var grid_cols_ce_propietarios = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: 'NumRegIdTrib', header: 'Registro Fiscal', editor: 'text', fillspace: 1},
    {id: 'ResidenciaFiscal', header: 'Residencia Fiscal', editor: 'text', fillspace: 1},
]


var grid_ce_propietarios = {
    view: 'datatable',
    id: 'grid_ce_propietarios',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    footer: false,
    columns: grid_cols_ce_propietarios,
}


var body_ce_propietarios = {rows:[
    {cols: [
        {view: 'button', id: 'cmd_ce_add_propietario', label: 'Agregar Propietario',
            icon: 'plus', type: 'iconButton', autowidth: true, align: 'center'},
        {},
    ]},
    {maxHeight: 10},
    grid_ce_propietarios
]}


var grid_cols_ce_receptor = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'NumRegIdTrib', header: 'Registro Fiscal', editor: 'text', fillspace: 1},
    {id: 'Calle', header: 'Calle *', editor: 'text', fillspace: 1},
    {id: 'NumeroExterior', header: 'Numero Exterior', editor: 'text', fillspace: 1},
    {id: 'NumeroInterior', header: 'Número Interior', editor: 'text', fillspace: 1},
    {id: 'Colonia', header: 'Colonia', editor: 'text', fillspace: 1},
    {id: 'Municipio', header: 'Municipio', editor: 'text', fillspace: 1},
    {id: 'Estado', header: 'Estado *', editor: 'text', fillspace: 1},
    {id: 'Pais', header: 'País *', editor: 'text', fillspace: 1},
    {id: 'CodigoPostal', header: 'C.P. *', editor: 'text', fillspace: 1},
]


var grid_ce_receptor = {
    view: 'datatable',
    id: 'grid_ce_receptor',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ce_receptor,
    data: [{id: 0}],
}


var body_ce_receptor = {rows:[
    grid_ce_receptor
]}


var grid_cols_ce_destinatario = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'NumRegIdTrib', header: 'Registro Fiscal', editor: 'text', fillspace: 1},
    {id: 'Nombre', header: 'Nombre', editor: 'text', fillspace: 1},
    {id: 'Calle', header: 'Calle *', editor: 'text', fillspace: 1},
    {id: 'NumeroExterior', header: 'No Exterior', editor: 'text', fillspace: 1},
    {id: 'NumeroInterior', header: 'No Interior', editor: 'text', fillspace: 1},
    {id: 'Colonia', header: 'Colonia', editor: 'text', fillspace: 1},
    {id: 'Municipio', header: 'Municipio', editor: 'text', fillspace: 1},
    {id: 'Estado', header: 'Estado *', editor: 'text', fillspace: 1},
    {id: 'Pais', header: 'País *', editor: 'text', fillspace: 1},
    {id: 'CodigoPostal', header: 'C.P. *', editor: 'text', fillspace: 1},
]


var grid_ce_destinatario = {
    view: 'datatable',
    id: 'grid_ce_destinatario',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    columns: grid_cols_ce_destinatario,
    data: [{id: 0}],
}


var body_ce_destinatario = {rows:[
    grid_ce_destinatario
]}


var grid_cols_ce_mercancias = [
    {id: 'id', header: 'ID', hidden: true},
    {id: 'delete', header: '', width: 30, css: 'delete'},
    {id: 'NoIdentificacion', header: 'Clave', editor: 'text', fillspace: 1},
    {id: 'FraccionArancelaria', header: 'Fraccion Arancelaria', editor: 'text', fillspace: 1},
    {id: 'CantidadAduana', header: 'Cantidad Aduana', editor: 'text', fillspace: 1},
    {id: 'UnidadAduana', header: 'Unidad Aduana', editor: 'text', fillspace: 1},
    {id: 'ValorUnitarioAduana', header: 'PU Aduana', editor: 'text', fillspace: 1},
    {id: 'ValorDolares', header: 'Valor USD', editor: 'text', fillspace: 1},
    {id: 'Marca', header: 'Marca', editor: 'text', hidden: true, fillspace: 1},
    {id: 'Modelo', header: 'Modelo', editor: 'text', hidden: true, fillspace: 1},
    {id: 'SubModelo', header: 'SubModelo', editor: 'text', hidden: true, fillspace: 1},
    {id: 'NumeroSerie', header: 'Serie', editor: 'text', hidden: true, fillspace: 1},
]


var grid_ce_mercancias = {
    view: 'datatable',
    id: 'grid_ce_mercancias',
    multiselect: false,
    adjust: true,
    autoheight: true,
    headermenu: true,
    editable: true,
    footer: true,
    columns: grid_cols_ce_mercancias,
}


var body_ce_mercancias = {rows:[
    {cols: [
        {view: 'button', id: 'cmd_ce_add_mercancia', label: 'Agregar Mercancía',
            icon: 'plus', type: 'iconButton', autowidth: true, align: 'center'},
        {},
    ]},
    {maxHeight: 10},
    grid_ce_mercancias
]}


var controls_comercio_exterior = [
    {cols: [{maxWidth: 15},
        {view: 'checkbox', id: 'chk_cfdi_usar_comercioe', labelWidth: 0,
            labelRight: 'Usar el complemento Comercio Exterior'},
        {},
        {view: 'button', id: 'cmd_import_json_comercioe', label: 'Importar JSON',
            icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'},
        {view: 'button', id: 'cmd_ce_import_ods', label: 'Importar ODS',
            icon: 'upload', type: 'iconButton', autowidth: true, align: 'center'},
        {maxWidth: 15}]},
    {view: 'fieldset', label: 'Datos generales', body: body_ce_datos_generales},
    {view: 'fieldset', label: 'Emisor', body: body_ce_emisor},
    {view: 'fieldset', label: 'Propietario', body: body_ce_propietarios},
    {view: 'fieldset', label: 'Receptor', body: body_ce_receptor},
    {view: 'fieldset', label: 'Destinatario', body: body_ce_destinatario},
    {view: 'fieldset', label: 'Mercancías', body: body_ce_mercancias},
]


var form_carta_porte = {
    type: 'space',
    responsive: true,
    cols: [{
        view: 'form',
        id: 'form_carta_porte',
        complexData: true,
        scroll: true,
        elements: controls_carta_porte,
    }]
}


var form_comercio_exterior = {
    type: 'space',
    responsive: true,
    cols: [{
        view: 'form',
        id: 'form_comercio_exterior',
        complexData: true,
        scroll: true,
        elements: controls_comercio_exterior,
    }]
}


var controls_invoices = [
    {
        view: 'tabview',
        id: 'tv_invoice',
        animate: true,
        cells: [
            {id: 'Generar', rows: controls_generate},
            {id: 'PreFacturas', rows: controls_prefactura},
            {id: 'INE', rows: controls_ine},
            {id: 'Leyendas Fiscales', rows: controls_leyendas_fiscales},
            {id: 'Carta Porte', rows: [form_carta_porte]},
            {id: 'Comercio Exterior', rows: [form_comercio_exterior]},
        ]
    },
]


var form_invoice = {
    type: 'space',
    responsive: true,
    cols: [{
        view: 'form',
        id: 'form_invoice',
        complexData: true,
        scroll: true,
        elements: controls_invoices,
    }]
}


var multi_invoices = {
    id: 'multi_invoices',
    view: 'multiview',
    animate: true,
    cells:[
        {id: 'invoices_home', rows:[
            {view: 'toolbar', elements: toolbar_invoices},
            {view: 'toolbar', elements: toolbar_invoices_util},
            {view: 'toolbar', elements: toolbar_invoices_filter},
            grid_invoices,
        ]},
        {id: 'invoices_new', rows:[form_invoice]}
    ]
}


var app_invoices = {
    id: "app_invoices",
    rows:[
        {view: "template", id: "th_invoices", type: "header", template:"Administración de Facturas" },
        multi_invoices
    ],
}


var body_upload_invoice = {rows: [
    {view: 'form', id: 'form_upload_invoice', rows: [
        {cols: [{},
            {view: 'uploader', id: 'up_invoice', autosend: false,
                link: 'lst_upload_invoice', value: 'Seleccionar Archivo',
                upload: '/files/invoiceods'}, {}]},
        {cols: [
            {view: 'list',  id: 'lst_upload_invoice', name: 'lst_upload_invoice',
                type: 'uploader', autoheight: true, borderless: true}]},
        {cols: [{}, {view: 'button', id: 'cmd_upload_invoice',
            label: 'Importar Factura'}, {}]},
    ]},
]}


var win_import_invoice = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_import_invoice',
            width: 400,
            modal: true,
            position: 'center',
            head: {view: 'toolbar',
                elements: [
                    {view: 'label', label: 'Importar Factura en Lote'},
                    {view: 'icon', icon: 'times-circle',
                        click: '$$("win_import_invoice").close()'},
                ]
            },
            body: body_upload_invoice,
        })
        $$('cmd_upload_invoice').attachEvent('onItemClick', cmd_upload_invoice_click)
        $$('up_invoice').attachEvent('onUploadComplete', up_invoice_upload_complete)
    }
}


var opt_reasons_cancel = [
    {id: '', value: ''},
    {id: '01', value: '[01] Comprobante emitido con errores con relación'},
    {id: '02', value: '[02] Comprobante emitido con errores sin relación'},
    {id: '03', value: '[03] No se llevó acabo la operación'},
    {id: '04', value: '[04] Operación nominativa relacionada en una factura global'},
]


var body_invoice_cancel = {rows: [{minHeight: 15},
    {view: 'richselect', id: 'lst_reasons_cancel', labelPosition: 'top', label: 'Razón de cancelación', options: opt_reasons_cancel, value: '', width: 400},
    {view: 'text', id: 'txt_cancel_uuid', labelPosition: 'top', label: 'UUID que sustituye', width: 400},
    {view: 'label', label: 'Esta acción no se puede deshacer', autowidth: true, align: 'center'},
    {view: 'label', label: '¿Estás segura de continuar?', autowidth: true, align: 'center'},
    {cols: [{},
        {view: 'button', id: 'cmd_invoice_cancel', width: 100, label: 'Cancelar', type: 'danger', icon: 'ban'},
        {maxWidth: 25},
        {view: 'button', id: 'cmd_win_cancel_close', width: 100, label: 'Cerrar'},
        {}
    ]},
    {minHeight: 20},
]}


var win_invoice_cancel = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_invoice_cancel',
            modal: true,
            width: 400,
            position: 'center',
            head: 'Cancelar CFDI',
            body: body_invoice_cancel,
        })
        $$('cmd_invoice_cancel').attachEvent('onItemClick', cmd_invoice_cancel_click)
        $$('cmd_win_cancel_close').attachEvent('onItemClick', cmd_win_cancel_close_click)
    }
}


var body_upload_carta_json = {rows: [
    {view: 'form', id: 'form_upload_carta', rows: [
        {cols: [{},
            {view: 'uploader', id: 'up_invoice_json', autosend: false,
                link: 'lst_upload_invoice', value: 'Seleccionar Archivo',
                accept:'application/json', upload: ''}, {}]},
        {cols: [
            {view: 'list',  id: 'lst_upload_invoice', name: 'lst_upload_invoice',
                type: 'uploader', autoheight: true, borderless: true}]},
        //~ {cols: [{}, {view: 'button', id: 'cmd_upload_invoice',
            //~ label: 'Importar Factura'}, {}]},
    ]},
]}


var win_carta_import_json = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_carta_import_json',
            width: 400,
            modal: true,
            position: 'center',
            head: 'Importar Carta Porte JSON',
            body: body_upload_carta_json,
        })
        $$('up_invoice_json').attachEvent('onAfterFileAdd', up_invoice_json_on_after_file_add)
    }
}


var body_upload_json_comercioe = {rows: [
    {view: 'form', id: 'form_upload_comercioe', rows: [
        {cols: [{},
            {view: 'uploader', id: 'up_invoice_json', autosend: false,
                link: 'lst_upload_invoice', value: 'Seleccionar Archivo',
                accept:'application/json', upload: ''}, {}]},
        {cols: [
            {view: 'list',  id: 'lst_upload_invoice', name: 'lst_upload_invoice',
                type: 'uploader', autoheight: true, borderless: true}]},
    ]},
]}


var win_import_json_comercioe = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_import_json_comercioe',
            width: 400,
            modal: true,
            position: 'center',
            head: 'Importar Comerio Exterior JSON',
            body: body_upload_json_comercioe,
        })
        $$('up_invoice_json').attachEvent('onAfterFileAdd', up_invoice_json_comercioe_on_after_file_add)
    }
}


var body_global_information = {rows: [{minHeight: 5},
    {view: 'richselect', id: 'lst_global_periodicidad', label: 'Periodicidad:', options: opt_global_periodicidad, value: '01'},
    {view: 'richselect', id: 'lst_global_months', label: 'Mes:', options: opt_global_months, value: '01'},
    {view: 'richselect', id: 'lst_global_year', label: 'Año:', options: []},
    {view: 'label', label: '¿Guardar estos datos?', width: 300, align: 'center'},
    {cols: [{},
        {view: 'button', id: 'cmd_save_global_information', width: 100, label: 'Si Guardar'},
        {maxWidth: 25},
        {view: 'button', id: 'cmd_win_global_close', width: 100, label: 'No, Cerrar'},
        {}
    ]},
    {minHeight: 10},
]}


var win_global_information = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_global_information',
            modal: true,
            width: 400,
            position: 'center',
            head: 'Información Global',
            body: body_global_information,
        })

        var current_date = new Date()
        var current_month = (current_date.getMonth() + 1).toString().padStart(2, '0')
        $$('lst_global_months').setValue(current_month)

        var current_year = current_date.getFullYear()
        $$('lst_global_year').getList().parse([{id: current_year, value: current_year}])
        $$('lst_global_year').setValue(current_year)

        $$('cmd_save_global_information').attachEvent('onItemClick', cmd_save_global_information_click)
        $$('cmd_win_global_close').attachEvent('onItemClick', cmd_win_global_close_click)
    }
}


var body_win_ce_import_ods = {rows: [
    {view: 'form', id: 'form_ce_import_ods', rows: [
        {cols: [{},
            {view: 'uploader', id: 'ce_up_template', autosend: false,
                link: 'lst_ce_up_template', value: 'Seleccionar Archivo',
                upload: '/files/ceods'}, {}]},
        {cols: [
            {view: 'list',  id: 'lst_ce_up_template',
                type: 'uploader', autoheight: true, borderless: true}]},
        {cols: [{}, {view: 'button', id: 'cmd_ce_upload_ods',
            label: 'Importar Plantilla'}, {}]},
    ]},
]}


var win_ce_import_ods = {
    init: function(){
        webix.ui({
            view: 'window',
            id: 'win_ce_import_ods',
            width: 400,
            modal: true,
            position: 'center',
            head: {view: 'toolbar',
                elements: [
                    {view: 'label', label: 'Importar desde archivo ODS'},
                    {view: 'icon', icon: 'times-circle',
                        click: '$$("win_ce_import_ods").close()'},
                ]
            },
            body: body_win_ce_import_ods,
        })
        $$('cmd_ce_upload_ods').attachEvent('onItemClick', cmd_ce_upload_ods_click)
        $$('ce_up_template').attachEvent('onUploadComplete', ce_up_template_complete)
    }
}