diff --git a/composer.json b/composer.json index 47ad7fb50636b18c6491e8713440af09f86541cf..1a26d4246206f65382c2f634e198c7ff7728908b 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,8 @@ "siu-toba/framework": "^3.2", "siu/instalador": "^1.5", "siu/toba-db": "^1.0.3", - "siu-toba/jasper": "5.6.1" + "siu-toba/jasper": "5.6.1", + "siu/api-afip": "^1.1" }, "config": { "bin-dir": "./bin" diff --git a/metadatos/componentes/toba_ei_formulario/dump_102000003.sql b/metadatos/componentes/toba_ei_formulario/dump_102000003.sql index 3308b45f826547071d64e462e6ee751f6205b81d..c15a172de6b88ce00dea58ffd83b39d8526e7ec1 100644 --- a/metadatos/componentes/toba_ei_formulario/dump_102000003.sql +++ b/metadatos/componentes/toba_ei_formulario/dump_102000003.sql @@ -102,7 +102,7 @@ INSERT INTO apex_objeto_ut_formulario (objeto_ut_formulario_proyecto, objeto_ut_ NULL, --clase NULL, --auto_reset '100%', --ancho - '150px', --ancho_etiqueta + '180px', --ancho_etiqueta '0', --expandir_descripcion NULL, --campo_bl NULL, --scroll @@ -387,15 +387,15 @@ INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_f 'Razón Social', --etiqueta NULL, --etiqueta_estilo NULL, --descripcion - NULL, --colapsado - NULL, --desactivado + '0', --colapsado + '0', --desactivado NULL, --estilo NULL, --total NULL, --inicializacion - NULL, --permitir_html - NULL, --deshabilitar_rest_func + '0', --permitir_html + '0', --deshabilitar_rest_func NULL, --estado_defecto - NULL, --solo_lectura + '0', --solo_lectura '0', --solo_lectura_modificacion NULL, --carga_metodo NULL, --carga_clase @@ -413,7 +413,7 @@ INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_f '0', --carga_permite_no_seteado NULL, --carga_no_seteado NULL, --carga_no_seteado_ocultar - NULL, --edit_tamano + '40', --edit_tamano NULL, --edit_maximo NULL, --edit_mascara NULL, --edit_unidad @@ -468,15 +468,15 @@ INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_f 'Domicilio Comercial', --etiqueta NULL, --etiqueta_estilo NULL, --descripcion - NULL, --colapsado - NULL, --desactivado + '0', --colapsado + '0', --desactivado NULL, --estilo NULL, --total NULL, --inicializacion - NULL, --permitir_html - NULL, --deshabilitar_rest_func + '0', --permitir_html + '0', --deshabilitar_rest_func NULL, --estado_defecto - NULL, --solo_lectura + '0', --solo_lectura '0', --solo_lectura_modificacion NULL, --carga_metodo NULL, --carga_clase @@ -545,19 +545,19 @@ INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_f 'email', --columnas '0', --obligatorio '0', --oculto_relaja_obligatorio - '6', --orden + '7', --orden 'Email', --etiqueta NULL, --etiqueta_estilo NULL, --descripcion - NULL, --colapsado - NULL, --desactivado + '0', --colapsado + '0', --desactivado NULL, --estilo NULL, --total NULL, --inicializacion - NULL, --permitir_html - NULL, --deshabilitar_rest_func + '0', --permitir_html + '0', --deshabilitar_rest_func NULL, --estado_defecto - NULL, --solo_lectura + '0', --solo_lectura '0', --solo_lectura_modificacion NULL, --carga_metodo NULL, --carga_clase @@ -575,7 +575,88 @@ INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_f '0', --carga_permite_no_seteado NULL, --carga_no_seteado NULL, --carga_no_seteado_ocultar - NULL, --edit_tamano + '40', --edit_tamano + NULL, --edit_maximo + NULL, --edit_mascara + NULL, --edit_unidad + NULL, --edit_rango + NULL, --edit_filas + NULL, --edit_columnas + NULL, --edit_wrap + NULL, --edit_resaltar + NULL, --edit_ajustable + NULL, --edit_confirmar_clave + NULL, --edit_expreg + NULL, --popup_item + NULL, --popup_proyecto + NULL, --popup_editable + NULL, --popup_ventana + NULL, --popup_carga_desc_metodo + NULL, --popup_carga_desc_clase + NULL, --popup_carga_desc_include + NULL, --popup_puede_borrar_estado + NULL, --fieldset_fin + NULL, --check_valor_si + NULL, --check_valor_no + NULL, --check_desc_si + NULL, --check_desc_no + NULL, --check_ml_toggle + NULL, --fijo_sin_estado + NULL, --editor_ancho + NULL, --editor_alto + NULL, --editor_botonera + NULL, --editor_config_file + NULL, --selec_cant_minima + NULL, --selec_cant_maxima + NULL, --selec_utilidades + NULL, --selec_tamano + NULL, --selec_ancho + NULL, --selec_serializar + NULL, --selec_cant_columnas + NULL, --upload_extensiones + NULL, --punto_montaje + NULL --placeholder +); +INSERT INTO apex_objeto_ei_formulario_ef (objeto_ei_formulario_fila, objeto_ei_formulario, objeto_ei_formulario_proyecto, identificador, elemento_formulario, columnas, obligatorio, oculto_relaja_obligatorio, orden, etiqueta, etiqueta_estilo, descripcion, colapsado, desactivado, estilo, total, inicializacion, permitir_html, deshabilitar_rest_func, estado_defecto, solo_lectura, solo_lectura_modificacion, carga_metodo, carga_clase, carga_include, carga_dt, carga_consulta_php, carga_sql, carga_fuente, carga_lista, carga_col_clave, carga_col_desc, carga_maestros, carga_cascada_relaj, cascada_mantiene_estado, carga_permite_no_seteado, carga_no_seteado, carga_no_seteado_ocultar, edit_tamano, edit_maximo, edit_mascara, edit_unidad, edit_rango, edit_filas, edit_columnas, edit_wrap, edit_resaltar, edit_ajustable, edit_confirmar_clave, edit_expreg, popup_item, popup_proyecto, popup_editable, popup_ventana, popup_carga_desc_metodo, popup_carga_desc_clase, popup_carga_desc_include, popup_puede_borrar_estado, fieldset_fin, check_valor_si, check_valor_no, check_desc_si, check_desc_no, check_ml_toggle, fijo_sin_estado, editor_ancho, editor_alto, editor_botonera, editor_config_file, selec_cant_minima, selec_cant_maxima, selec_utilidades, selec_tamano, selec_ancho, selec_serializar, selec_cant_columnas, upload_extensiones, punto_montaje, placeholder) VALUES ( + '102000032', --objeto_ei_formulario_fila + '102000003', --objeto_ei_formulario + 'pirapire', --objeto_ei_formulario_proyecto + 'domicilio_comercial_nombre', --identificador + 'ef_editable', --elemento_formulario + 'domicilio_comercial_nombre', --columnas + '0', --obligatorio + '0', --oculto_relaja_obligatorio + '6', --orden + 'Domicilio Comercial', --etiqueta + NULL, --etiqueta_estilo + NULL, --descripcion + '0', --colapsado + '0', --desactivado + NULL, --estilo + NULL, --total + NULL, --inicializacion + '0', --permitir_html + '0', --deshabilitar_rest_func + NULL, --estado_defecto + '0', --solo_lectura + '0', --solo_lectura_modificacion + NULL, --carga_metodo + NULL, --carga_clase + NULL, --carga_include + NULL, --carga_dt + NULL, --carga_consulta_php + NULL, --carga_sql + NULL, --carga_fuente + NULL, --carga_lista + NULL, --carga_col_clave + NULL, --carga_col_desc + NULL, --carga_maestros + NULL, --carga_cascada_relaj + '0', --cascada_mantiene_estado + '0', --carga_permite_no_seteado + NULL, --carga_no_seteado + NULL, --carga_no_seteado_ocultar + '40', --edit_tamano NULL, --edit_maximo NULL, --edit_mascara NULL, --edit_unidad diff --git a/php/afip.php b/php/afip.php new file mode 100644 index 0000000000000000000000000000000000000000..7876150d84cdd3ced1b0cbcd773f37d29c92b029 --- /dev/null +++ b/php/afip.php @@ -0,0 +1,115 @@ +<?php + +/** + * + */ +class Afip +{ + protected $afip; + protected $afip_config; + protected $padron_cuatro; + + public function __construct() + { + $afip_ini = new toba_ini(toba::instalacion()->get_path_carpeta_instalacion()."/afip.ini"); + $this->afip_config = $afip_ini->get_datos_entrada('afip_config'); + + if (isset($this->afip_config['cuit']) && isset($this->afip_config['cert']) && isset($this->afip_config['key'])) { + $config = [ + 'CUIT' => $this->afip_config['cuit'], + 'production' => $this->afip_config['produccion'], + 'cert' => $this->afip_config['cert'], + 'key' => $this->afip_config['key'], + 'token_dir' => $this->afip_config['token_dir'] + ]; + + try { + $this->afip = new \SIU\Afip\Afip($config); + $this->padron_cuatro = new \SIU\Afip\WebService\PadronAlcanceCuatro($this->afip); + } catch (\Exception $e) { + toba::notificacion()->warning($e->getMessage()); + toba::logger()->info($e->getMessage()); + } + } + } + + /** + * Valida si esta configurado el WS de AFIP y si las credenciales configuradas + * se conectan correctamente. + * + * @return \|boolean ( description_of_the_return_value ) + */ + public function conectado() + { + $res = false; + + if (isset($this->afip_config['cuit']) && isset($this->afip_config['cert']) && isset($this->afip_config['key'])) { + try { + $res = $this->padron_cuatro->getEstadoServicio(); + + $datos = get_object_vars($res); + + if ($datos['appserver'] == 'OK' && $datos['authserver'] == 'OK' && $datos['dbserver'] == 'OK') { + $res = true; + } + } catch (\Exception $e) { + toba::notificacion()->warning($e->getMessage()); + toba::logger()->info($e->getMessage()); + } + } + + return $res; + } + + public function get_contribuyente_detalle($cuit) + { + $datos = []; + + if (isset($this->datos[$cuit])) { + return $this->datos[$cuit]; + } + + $cuit_sin_guiones = str_replace('-', '', $cuit); + $res = $this->padron_cuatro->getContribuyenteDetalle($cuit_sin_guiones); + + if (is_object($res)) { + $datos = $this->datos[$cuit] = get_object_vars($res); + } + + return $datos; + } + + public function get_opciones_domicilios($cuit) + { + $datos = $this->get_contribuyente_detalle($cuit); + + $prov_domicilios = []; + + if (!isset($datos['domicilio'])) { + return $prov_domicilios; + } + + if (is_array($datos['domicilio'])) { + foreach ($datos['domicilio'] as $domicilio) { + $domicilios[] = get_object_vars($domicilio); + } + } elseif (is_object($datos['domicilio'])) { + $domicilios[] = get_object_vars($datos['domicilio']); + } + + if (isset($domicilios)) { + $domi = []; + + foreach ($domicilios as $domicilio) { + $domi["direccion"] = null; + $domi["direccion"] .= (isset($domicilio["direccion"])) ? $domicilio["direccion"] : ""; + $domi["direccion"] .= (isset($domicilio["descripcionProvincia"])) ? " ".$domicilio["descripcionProvincia"] : ""; + $domi["direccion"] .= (isset($domicilio["localidad"])) ? " ".$domicilio["localidad"] : ""; + $domi["direccion"] = utf8_decode($domi["direccion"]); + $prov_domicilios[] = $domi; + } + } + + return $prov_domicilios; + } +} diff --git a/php/comprobantes/ci_generar_comprobante.php b/php/comprobantes/ci_generar_comprobante.php index 0b769d949eace9e9a8d8035540496ae797a8d2e7..5abdff0a94a8bb1058cd386ff7e4408e8da5d031 100644 --- a/php/comprobantes/ci_generar_comprobante.php +++ b/php/comprobantes/ci_generar_comprobante.php @@ -1,7 +1,7 @@ <?php class ci_generar_comprobante extends pirapire_ci { - + protected $s__domicilios; //----------------------------------------------------------------------------------- //---- form_emisor ------------------------------------------------------------------ //----------------------------------------------------------------------------------- @@ -35,6 +35,10 @@ class ci_generar_comprobante extends pirapire_ci public function conf__form_receptor(form_receptor $form) { + if (is_array($this->s__domicilios)) { + $this->dep('form_receptor')->ef('domicilio_comercial')->set_opciones($this->s__domicilios); + } + $datos = $this->cn()->get_datos_receptor(); if (is_array($datos)) { @@ -44,6 +48,9 @@ class ci_generar_comprobante extends pirapire_ci public function evt__form_receptor__modificacion($datos) { + if (isset($this->s__domicilios[$datos['domicilio_comercial']])) { + $datos['domicilio_comercial_nombre'] = $this->s__domicilios[$datos['domicilio_comercial']]; + } $this->cn()->set_datos_receptor($datos); } @@ -126,6 +133,42 @@ class ci_generar_comprobante extends pirapire_ci $respuesta->set($item); } + + public function ajax__get_datos_receptor_afip($parametros, toba_ajax_respuesta $respuesta) + { + $this->s__domicilios = $datos = []; + $afip = new \Afip(); + + if ($afip->conectado() && $parametros['tipo_doc'] == constantes::get('AFIP_TIPO_DOC_CUIT')) { + $datos_receptor = $afip->get_contribuyente_detalle($parametros['nro_doc']); + + if (isset($datos_receptor) && is_array($datos_receptor)) { + $datos_receptor_domicilios = $afip->get_opciones_domicilios($parametros['nro_doc']); + + if (is_array($datos_receptor_domicilios)) { + foreach ($datos_receptor_domicilios as $domicilio) { + $this->s__domicilios[] = $domicilio['direccion']; + } + $datos['domicilios'] = $this->s__domicilios; + $this->dep('form_receptor')->ef('domicilio_comercial')->set_opciones($this->s__domicilios); + } + } + + if (isset($datos_receptor['email']->direccion)) { + $datos['email'] = utf8_decode($datos_receptor['email']->direccion); + } + + if (isset($datos_receptor['razonSocial'])) { + $datos['razon_social'] = utf8_decode($datos_receptor['razonSocial']); + } elseif (isset($datos_receptor['apellido'])) { + $datos['razon_social'] = utf8_decode($datos_receptor['apellido']).' '.utf8_decode($datos_receptor['nombre']); + } + } + + $respuesta->set($datos); + } + + //----------------------------------------------------------------------------------- //---- Eventos ---------------------------------------------------------------------- //----------------------------------------------------------------------------------- diff --git a/php/comprobantes/cn_generar_comprobante.php b/php/comprobantes/cn_generar_comprobante.php index d577647707ce0c058b4311317cbd5a5668d0eea0..c58a372bf7e8a9511acdbc761c2d0ccdcba960b5 100644 --- a/php/comprobantes/cn_generar_comprobante.php +++ b/php/comprobantes/cn_generar_comprobante.php @@ -79,7 +79,7 @@ class cn_generar_comprobante extends pirapire_cn $datos_receptor = [ "nombre"=> $this->s__datos_receptor['razon_social'], "apellido"=> $this->s__datos_receptor['razon_social'], - "domicilio"=> $this->s__datos_receptor['domicilio_comercial'], + "domicilio"=> $this->s__datos_receptor['domicilio_comercial_nombre'], "razon_social"=> $this->s__datos_receptor['razon_social'], "condicion_iva"=> $this->s__datos_receptor['condicion_iva'], "tipo_documento"=> $this->s__datos_receptor['tipo_doc'], @@ -184,7 +184,7 @@ class cn_generar_comprobante extends pirapire_cn $venta_sq['medio_pago'] = constantes::get('SQ_MEDIO_PAGO_EFECTIVO'); $venta_sq['canal_venta'] = constantes::get('SQ_CANAL_VENTA_VIRTUAL'); $venta_sq['realizada_en'] = $datos_emisor['fecha_comprobante']; - $venta_sq['unidad_venta'] = 'e51edbd1-021e-4b96-9d16-d5ed948ff115'; + $venta_sq['unidad_venta'] = 'ff996fc6-9140-48c4-a4a2-1d507a82cb40'; $venta_sq['id_referencia'] = null; $venta_sq['importe_total'] = $importe; $venta_sq['condicion_venta'] = constantes::get('SQ_CONDICION_VENTA_CONTADO'); diff --git a/php/comprobantes/form_receptor.php b/php/comprobantes/form_receptor.php index e8a42427d04e4c08d988cafec30afc90c57678a2..2cad2777c3f4c10ca5ba1b9e5ed63f6af2190d42 100644 --- a/php/comprobantes/form_receptor.php +++ b/php/comprobantes/form_receptor.php @@ -1,6 +1,65 @@ <?php class form_receptor extends pirapire_ei_formulario { -} + //----------------------------------------------------------------------------------- + //---- JAVASCRIPT ------------------------------------------------------------------- + //----------------------------------------------------------------------------------- + + public function extender_objeto_js() + { + echo "{$this->objeto_js}.ini = function() + { + if(this.ef('domicilio_comercial').tiene_estado()) + { + this.ef('domicilio_comercial').mostrar(); + this.ef('domicilio_comercial_nombre').ocultar(); + }else{ + this.ef('domicilio_comercial').ocultar(); + this.ef('domicilio_comercial_nombre').mostrar(); + } + };"; + + echo " + //---- Procesamiento de EFs -------------------------------- + + {$this->objeto_js}.evt__nro_doc__procesar = function(es_inicial) + { + var nro_doc = this.ef('nro_doc'); + var tipo_doc = this.ef('tipo_doc'); + + if(!es_inicial && nro_doc.tiene_estado()){ + var nro_doc = nro_doc.get_estado(); + var tipo_doc = tipo_doc.get_estado(); + + var parametros = { nro_doc: nro_doc, tipo_doc: tipo_doc}; -?> \ No newline at end of file + this.controlador.ajax('get_datos_receptor_afip', parametros, this, this.actualizar_datos_receptor ); + } + + {$this->objeto_js}.actualizar_datos_receptor = function(datos) + { + this.ef('email').set_estado(''); + this.ef('razon_social').set_estado(''); + this.ef('domicilio_comercial_nombre').set_estado(''); + this.ef('domicilio_comercial').resetear_estado(); + + if(datos.email){ + this.ef('email').set_estado(datos.email); + } + if(datos.razon_social){ + this.ef('razon_social').set_estado(datos.razon_social); + } + + if(Array.isArray(datos.domicilios) && datos.domicilios.length > 0){ + this.ef('domicilio_comercial').mostrar(); + this.ef('domicilio_comercial_nombre').ocultar(); + this.ef('domicilio_comercial').set_opciones(datos.domicilios); + }else{ + this.ef('domicilio_comercial').ocultar(); + this.ef('domicilio_comercial_nombre').mostrar(); + } + } + } + "; + } +} diff --git a/php/constantes.php b/php/constantes.php index 15f6530e745a86e2a3daffdafd877c3bc75b365b..6e3bf1f88e9e2e38b73693b527e7f410e3a0d158 100644 --- a/php/constantes.php +++ b/php/constantes.php @@ -7,6 +7,7 @@ class constantes ,'AFIP_CONCEPTO_PROD_SERV' => array('valor' => 3) ,'AFIP_CONCEPTO_SERV' => array('valor' => 2) ,'AFIP_CONCEPTO_OTRO' => array('valor' => 4) + ,'AFIP_TIPO_DOC_CUIT' => array('valor' => 80) ,'SQ_ESTADO_VENTA_COBRADA' => array('valor' => 2) ,'SQ_CONCEPTO_COBRANZA_NETO' => array('valor' => 1) ,'SQ_MEDIO_PAGO_EFECTIVO' => array('valor' => 1) diff --git a/php/pirapire_autoload.php b/php/pirapire_autoload.php index 446d4275e5ac3e8e441c25ed171f0894f5831062..f237ba00700b65cafc6ed9b9869745797e512721 100644 --- a/php/pirapire_autoload.php +++ b/php/pirapire_autoload.php @@ -22,6 +22,7 @@ class pirapire_autoload 'cn_administrar_productos' => 'administrar_productos_servicios/productos/cn_administrar_productos.php', 'ci_administrar_servicios' => 'administrar_productos_servicios/servicios/ci_administrar_servicios.php', 'cn_administrar_servicios' => 'administrar_productos_servicios/servicios/cn_administrar_servicios.php', + 'Afip' => 'afip.php', 'ci_generar_comprobante' => 'comprobantes/ci_generar_comprobante.php', 'cn_generar_comprobante' => 'comprobantes/cn_generar_comprobante.php', 'form_emisor' => 'comprobantes/form_emisor.php',