Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CreateVoucher fecha en formato no valido #6

Closed
agustinbus opened this issue Jun 27, 2018 · 29 comments
Closed

CreateVoucher fecha en formato no valido #6

agustinbus opened this issue Jun 27, 2018 · 29 comments

Comments

@agustinbus
Copy link

Hola como estan? Estoy realizando unas pruebas con la librería, genero correctamente los certificados y demas, pero al generar el voucher me arroja el siguiente error:

Fatal error: Uncaught Exception: (10016) Campo CbteFch No corresponde a una fecha valida con formato YYYYMMDD in /Applications/MAMP/htdocs/fe-6/src/Afip_res/Class/ElectronicBilling.php:364 Stack trace: #0 /Applications/MAMP/htdocs/fe-6/src/Afip_res/Class/ElectronicBilling.php(308): ElectronicBilling->_CheckErrors('FECAESolicitar', Object(stdClass)) #1 /Applications/MAMP/htdocs/fe-6/src/Afip_res/Class/ElectronicBilling.php(92): ElectronicBilling->ExecuteRequest('FECAESolicitar', Array) #2 /Applications/MAMP/htdocs/fe-6/examples/CreateVoucher.php(69): ElectronicBilling->CreateVoucher(Array) #3 {main} thrown in /Applications/MAMP/htdocs/fe-6/src/Afip_res/Class/ElectronicBilling.php on line 364

Probe con los mismos certificados en un entorno con Windows y funciona perfecto. Pero en Mac OSx, me arroja error con el formato de fechas. Hice un print de la fecha que le paso al campo CbteFch y me arroja en el formato YYYYMMDD. Tambíen intente no pasarle el parametro CbteFch y tambien me arroja el mismo error. Alguna idea de cual puede ser el problema?

Los felicito por la libreria está increíble! En el futuro la migrare para Laravel y la compartiré.
Saludos y muchas gracias desde ya.

@ivanalemunioz
Copy link
Collaborator

ivanalemunioz commented Jun 27, 2018 via email

@agustinbus
Copy link
Author

Hola Ivan! Si, probe con la función date y tambien "hardcodeando" la fecha. Ademas probe pasarle NULL, y tambien no pasar el campo CbteFch. Ahi paso el código:

`<?php
include '../src/Afip.php';

$data = array(
'CantReg' => 1, // Cantidad de comprobantes a registrar
'PtoVta' => 3, // Punto de venta
'CbteTipo' => 11, // Tipo de comprobante (ver tipos disponibles)
'Concepto' => 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
'DocTipo' => 80, // Tipo de documento del comprador (ver tipos disponibles)
'DocNro' => 20306370708, // Numero de documento del comprador
'CbteDesde' => 1, // Numero de comprobante o numero del primer comprobante en caso de ser mas de uno
'CbteHasta' => 1, // Numero de comprobante o numero del ultimo comprobante en caso de ser mas de uno
'CbteFch' => intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
'ImpTotal' => 1, // Importe total del comprobante
'ImpTotConc' => 0, // Importe neto no gravado
'ImpNeto' => 1, // Importe neto gravado
'ImpOpEx' => 0, // Importe exento de IVA
'ImpIVA' => 0, //Importe total de IVA
'ImpTrib' => 0, //Importe total de tributos
'FchServDesde' => NULL, // (Opcional) Fecha de inicio del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
'FchServHasta' => NULL, // (Opcional) Fecha de fin del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
'FchVtoPago' => NULL, // (Opcional) Fecha de vencimiento del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
'MonId' => 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos)
'MonCotiz' => 1, // Cotización de la moneda usada (1 para pesos argentinos)
);

$afip = new Afip(array('CUIT' => 27328056807, 'production' => true, 'cert' => 'CN27328056807_6254f0c7b9d1978b.crt', 'key' => '27328056807.key'));

$res = $afip->ElectronicBilling->CreateVoucher($data);

echo $res['CAE']; //CAE asignado el comprobante
echo $res['CAEFchVto']; //Fecha de vencimiento del CAE (yyyy-mm-dd)

?>
`

@ivanalemunioz
Copy link
Collaborator

ivanalemunioz commented Jun 27, 2018 via email

@agustinbus
Copy link
Author

Probe con string y con int, y tambien me tira error

@agustinbus
Copy link
Author

Ahora voy a hacer unas pruebas en un server con linux a ver como se comporta!

@guillebalmacedaonline
Copy link

Buenas chicos, probe la libreria y esta funcionando full. Tambien estoy con ganas de hacer el paso a Laravel jeje esa seria una actualizacion... Mi proyecto esta en laravel y me hice maña para hacerlo funcionar. Con respecto al error con la fecha del Comprobante. Dime que version de PHP estas utilizando... y si haces un var_dump() de intval(date('Ymd')), prueba tambien hardcodeando lo siguiente con fecha actual intval('20180627')

@agustinbus
Copy link
Author

Hola Guille!, Probé también con intval('20180627') y sigo con el mismo error. El dump me arroja int(20180627). La versión que estoy utilizando de PHP es la 7.0.0. Probé tambien con la 5.1.6, 5.2.7, 5.6.10. Además intenté cambiar la configuración del timezone del php.ini, pero nada. Me esta matando el error :(

@guillebalmacedaonline
Copy link

Muy extraño hermano. Lo que si, ese error ya lo da afip por lo que entiendo. Puede que se tenga que depurar el archivo ElectronicBilliing.php para ver como confecciona el archivo xml con el que hace soap.

@agustinbus
Copy link
Author

Si la verdad muy raro, acabo de hacer una prueba en un servidor con linux y va de 10! Debe ser algun problema de configuración de mi XAMPP, versión php, etc. ya que como vos decis el error lo devuelve el webservice de Afip.

@guillebalmacedaonline
Copy link

Yo uso xamp la ultima version. Pero si tube problema con una version anterior. En mi caso fue con la ejecucion de soap.

@ivanalemunioz
Copy link
Collaborator

Pudiste solucionar el problema Agustin?

@estebanbordon
Copy link

estebanbordon commented Jul 24, 2018

Hola gente, comparto lo que me soluciono este problema:

quitar la referencia (&) en el parametro $data dentro del metodo CreateVoucher.

Ivan, excelente trabajo, saludos

@tecnoher
Copy link

@agustinbus disculpa que vuelva con este tema, estoy teniendo un inconveniente similar al que te paso con lo de la fecha "Campo CbteFch No corresponde a una fecha valida con formato YYYYMMDD" también veo que en un servidor cuando cargo el wsdl con FECAESolicitar, me carga bien la CABECERA pero no el DETALLE, queda vacio, tal vez por esto de la fecha, como lo solucionaste?

@NicoMachado
Copy link

Hola @tecnoher

Probaron asi?

'CbteFch' => intval(date('Ymd', strtotime($cbteFch))), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo

donde $cbteFch = $cuota->fecha_creacion;
osea un campo fecha

Saludos

@tecnoher
Copy link

Hola @NicoMachado gracias por tu respuesta.
En el wsdl el campo CbteFch está declarado como string
<s:element minOccurs="0" maxOccurs="1" name="CbteFch" type="s:string"/>

y en el documento de AFIP dice que es un STRING de 8, es muy raro lo que pasa por que no se me llena ni un campo del
<s:complexType name="FEDetRequest">

@NicoMachado
Copy link

hola @tecnoher , te pego aca como armo mi request...

                    //Ver Ejemplo de afipSDK
                    $data = array(
                            'CantReg' 		=> 1, // Cantidad de comprobantes a registrar
                            'PtoVta' 		=> $ptoVta, // Punto de venta
                            'CbteTipo' 		=> $CbteTipo, // Tipo de comprobante (ver tipos disponibles) 
                            'Concepto' 		=> 2, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
                            'DocTipo' 		=> $docTipo, // Tipo de documento del comprador (ver tipos disponibles)
                            'DocNro' 		=> $docNro, // Numero de documento del comprador
                            'CbteDesde' 	=> $UltNro, // Numero de comprobante o numero del primer comprobante en caso de ser mas de uno
                            'CbteHasta' 	=> $UltNro, // Numero de comprobante o numero del ultimo comprobante en caso de ser mas de uno
                            //'CbteFch' 		=> intval(date('Ymd')), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
                            'CbteFch' 		=> intval(date('Ymd', strtotime($cbteFch))), // (Opcional) Fecha del comprobante (yyyymmdd) o fecha actual si es nulo
                            'ImpTotal' 		=> $imp_total, // Importe total del comprobante
                            'ImpTotConc'            => $imp_total_conceptos, // Importe neto no gravado
                            'ImpNeto' 		=> $imp_neto, // Importe neto gravado
                            'ImpOpEx' 		=> 0, // Importe exento de IVA
                            'ImpIVA' 		=> 0, //Importe total de IVA
                            'ImpTrib' 		=> 0, //Importe total de tributos
                            'FchServDesde' 	=> intval(date('Ymd',  strtotime($recibo->fecha))), // (Opcional) Fecha de inicio del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
                            'FchServHasta' 	=> intval(date('Ymd',  strtotime($recibo->fecha))), // (Opcional) Fecha de fin del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
                            'FchVtoPago' 	=> intval(date('Ymd',  strtotime($recibo->fecha))), // (Opcional) Fecha de vencimiento del servicio (yyyymmdd), obligatorio para Concepto 2 y 3
                            'MonId' 		=> 'PES', //Tipo de moneda usada en el comprobante (ver tipos disponibles)('PES' para pesos argentinos) 
                            'MonCotiz' 		=> 1, // Cotización de la moneda usada (1 para pesos argentinos)  
                            'Opcionales' 	=> array( // (Opcional) Campos auxiliares
                                    array(
                                            'Id' 		=> 10, // Codigo de tipo de opcion (ver tipos disponibles) 
                                            'Valor' 	=> 1 // Valor 
                                    ),
                                    array(
                                        'Id' => 1011,
                                        'Valor' => $docTipo
                                    ),
                                    array(
                                        'Id' => 1012,
                                        'Valor' => (float) $docNro
                                    ),
                            ), 
                    );

luego solo invoco al metodo...

                    try {
                         $result = $afip->ElectronicBilling->CreateVoucher($data);
                         var_dump($result);
                    } catch (Exception $ex) {
                         $error = utf8_decode($ex->getMessage());
                    }      


Fijate si te da alguna punta.
Postea como armas el request, si queres.

@tecnoher
Copy link

tecnoher commented Feb 27, 2019

Te muestro lo que cargo en el WSDL en la etiqueta FECAESolicitar -> FeCAEReq

de ahí me carga bien el FeCabReq pero el FeDetReq lo deja vacio, osea que el error no es tanto por el campo CbteFch en sí, sino por que no hay datos a ese nivel

subo una imagen acá por que se pegó horrible el array
https://i.imgur.com/Di0iKLr.png

https://i.imgur.com/VgwyX1g.png

"FeCAEReq" => array:2 [▼ "FeCabReq" => array:3 [▼ "CantReg" => 1 "PtoVta" => 17 "CbteTipo" => 6 ] "FeDetReq" => array:1 [▼ "FECAEDetRequest" => array:1 [▼ 0 => & array:18 [▼ "Concepto" => 1 "DocTipo" => 80 "DocNro" => 2030749807.0 "CbteDesde" => 1 "CbteHasta" => 1 "CbteFch" => "20190227" "ImpTotal" => 7018.0 "ImpTotConc" => 0.0 "ImpNeto" => 5800.0 "ImpOpEx" => 0.0 "ImpTrib" => 0 "ImpIVA" => 1218.0 "FchServDesde" => "" "FchServHasta" => "" "FchVtoPago" => "" "MonId" => "PES" "MonCotiz" => 1 "Iva" => array:1 [▼ "AlicIva" => array:1 [▼ 0 => array:3 [▼ "Id" => 5 "BaseImp" => 5800.0 "Importe" => 1218.0 ] ] ] ] ] ] ]

este es el response con los errores
+"FeDetResp": {#417 ▼ +"FECAEDetResponse": {#385 ▼ +"Concepto": 0 +"DocTipo": 0 +"DocNro": 0 +"CbteDesde": 0 +"CbteHasta": 0 +"Resultado": "R" +"CAE": "" +"CAEFchVto": "" } } +"Errors": {#391 ▼ +"Err": array:2 [▼ 0 => {#388 ▼ +"Code": 10016 +"Msg": "Campo CbteFch No corresponde a una fecha valida con formato YYYYMMDD" } 1 => {#421 ▼ +"Code": 10008 +"Msg": "Campo CbteDesde se encuentre entre entre 1 y 99999999." } ] } }

@NicoMachado
Copy link

Me llama la atencion eso que remarco, justamente el elemento FECAEDetRequest parece ser un array con un formato cod =>valor ...
Y deberia ser solo un array...

image

podes pegar el codigo fuente de como armas el $data ?

@tecnoher
Copy link

si es raro, pero bueno estbaa usando otra libreria, ahora me estoy pasando a esta libreria, te re agradezco igual haberte tomado el tiempo de ayudarme.
Te hago una consulta sencilla ya que estamos, hay un metodo de consulta de dni? algo donde por dni me traiga el cuit de la persona?

@ivanalemunioz
Copy link
Collaborator

ivanalemunioz commented Feb 28, 2019 via email

@NicoMachado
Copy link

Hola @tecnoher, si estaria bueno que te pases a la libreria!, la verdad me sorprendio la simpleza.
no no hay nada como una funcion asi, ya tenes que tener el CUIT/CUIL de antemano.

@davidfabbretti
Copy link

Hola! https://es.wikipedia.org/wiki/Clave_Única_de_Identificación_Tributaria acá explica cómo obtener el CUIT desde un DNI.

@tecnoher
Copy link

tecnoher commented Feb 28, 2019

Y probaste poniendo la fecha como numero?

On Wed, 27 Feb 2019 at 19:32 Hernan T @.***> wrote: si es raro, pero bueno estbaa usando otra libreria, ahora me estoy pasando a esta libreria, te re agradezco igual haberte tomado el tiempo de ayudarme. Te hago una consulta sencilla ya que estamos, hay un metodo de consulta de dni? algo donde por dni me traiga el cuit de la persona? — You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub <#6 (comment)>, or mute the thread https://github.com/notifications/unsubscribe-auth/Aaa8Th16OXkQk8yCviW5Mvpg_3gJPsafks5vRweagaJpZM4U5pE5 .

Sisi, pero el tema es que usaba otra libreria, que acaba de pasar a mejor vida jaja, ahora está funcionando todo de 10

ya que te tengo acá Ivan, te felicito por la SDK,

sabes que en la otra librería que usaba se hacía una consulta de constancia de inscripcion, que si no encontraba a la persona inscripta, de todas maneras te daba el nombre completo, dni (igual es el parámetro que se le pasa a la funcion) y dirección a veces..

https://www.afip.gob.ar/ws/WSCI/manualwssrwsconstanciainscripcionv2.0.pdf

estoy tratando de hacerlo funcionar pero si pongo el servicio en el TA me da un error

$ta = $this->afip->GetServiceTA('ws_sr_constancia_inscripcion');

@tecnoher
Copy link

Hola @tecnoher, si estaria bueno que te pases a la libreria!, la verdad me sorprendio la simpleza.
no no hay nada como una funcion asi, ya tenes que tener el CUIT/CUIL de antemano.

Gracias Nicolas es simple y clara (no tan simple igual ehh tiene su buen trabajito). Ya la estoy utilizando :)

@tecnoher
Copy link

casi me da un infarto... usanto en producción esta librería me salió el mismo mensaje del campo CbteFch incorrecto..
lo que hice fué sacar la referencia de la variable $data (&$data) en el método CreateVoucher y funcionó!

'FECAEDetRequest' => $data

tal cual lo dijo "estebanbordon" en este thread

gracias gente!

@NicoMachado
Copy link

Hola @tecnoher @estebanbordon , solo para sacarme la curiosidad
en mi caso funciona la linea:

...
'FeDetReq' => array(
'FECAEDetRequest' => &$data
)
...

Con el operador por referencia.
Que version de PHP estan corriendo ?
en mi caso estoy corriendo un XAMPP, con PHP Version 5.3.1.

Gracias

@tecnoher
Copy link

Si lo ejecuto local (docker, apache y php7.1) funciona esa linea pero en el servidor que tengo no funciona.
El servidor esun VPS con Centos7 y PHP 7.0.33 (cli)
Estoy casi seguro que es por la versión de PHP

@tecnoher
Copy link

Aca vengo de nuevo con un UPGRADE, finalmente encontré que actualizando el WSDL de la consulta A13 se puede obtener un CUIT por DNI

Se llama al "getIdPersonaListByDocumento" y el WS te devuelve el cuit de la persona

Tenés que actualizar el archivo "ws_sr_padron_a13-production.wsdl" por el que está en este link:
wsdl -> https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA13?WSDL

@esclaudio
Copy link

esclaudio commented Aug 30, 2021

Hola!

Confirmo que la solución que dieron @tecnoher y @NicoMachado funciona (pasar la variable $data por valor). El problema surge concretamente con PHP 7.0.

En mi caso, lo que hice fue cambié el orden de las asignaciones para respetar el funcionamiento anterior:

file: src/Afip_res/Class/ElectronicBilling.php

public function CreateVoucher($data, $return_response = FALSE)
{
    $req = array(
        'FeCAEReq' => array(
            'FeCabReq' => array(
                'CantReg' 	=> $data['CbteHasta']-$data['CbteDesde']+1,
                'PtoVta' 	=> $data['PtoVta'],
                'CbteTipo' 	=> $data['CbteTipo']
                ),
            'FeDetReq' => array( 
                'FECAEDetRequest' => null // CAMBIÉ ESTO!
            )
        )
    );

    unset($data['CantReg']);
    unset($data['PtoVta']);
    unset($data['CbteTipo']);

    if (isset($data['Tributos'])) 
        $data['Tributos'] = array('Tributo' => $data['Tributos']);

    if (isset($data['Iva'])) 
        $data['Iva'] = array('AlicIva' => $data['Iva']);

    if (isset($data['Opcionales'])) 
        $data['Opcionales'] = array('Opcional' => $data['Opcionales']);

    $req['FeCAEReq']['FeDetReq']['FECAEDetRequest'] = $data; // Y AGREGUÉ ESTO!

Gracias!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants