AfipSDK / afip.php

Libreria para usar los Web Services de AFIP
https://afipsdk.com/
MIT License
268 stars 118 forks source link

CreateVoucher fecha en formato no valido #6

Closed agustinbus closed 6 years ago

agustinbus commented 6 years ago

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 commented 6 years ago

Hola Agustin, estás pasando el la fecha con la función date? Podrías mostrarnos el código?

El El mié, 27 jun. 2018 a las 09:43, agustinbus notifications@github.com escribió:

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 https://github.com/ivanalemunioz/afip.php/pull/1 /Applications/MAMP/htdocs/fe-6/src/Afip_res/Class/ElectronicBilling.php(92): ElectronicBilling->ExecuteRequest('FECAESolicitar', Array) #2 https://github.com/ivanalemunioz/afip.php/issues/2 /Applications/MAMP/htdocs/fe-6/examples/CreateVoucher.php(69): ElectronicBilling->CreateVoucher(Array) #3 https://github.com/ivanalemunioz/afip.php/issues/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.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/ivanalemunioz/afip.php/issues/6, or mute the thread https://github.com/notifications/unsubscribe-auth/Aaa8TmNNX-Itte-QygTaBHg3XZs5PF6hks5uA33fgaJpZM4U5pE5 .

agustinbus commented 6 years ago

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 commented 6 years ago

No veo nada raro allí, además me decís que funciona en windows y no en osx, nunca probé desde osx, seguiré pensando que puede ser. Al hardcodear la fecha le pasaste un string o un numero?

El El mié, 27 jun. 2018 a las 11:28, agustinbus notifications@github.com escribió:

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)

?> `

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/ivanalemunioz/afip.php/issues/6#issuecomment-400692351, or mute the thread https://github.com/notifications/unsubscribe-auth/Aaa8TkHSmulonincWHuPxodRxmPHJtzKks5uA5aegaJpZM4U5pE5 .

agustinbus commented 6 years ago

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

agustinbus commented 6 years ago

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

guillebalmacedaonline commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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

ivanalemunioz commented 6 years ago

Pudiste solucionar el problema Agustin?

estebanbordon commented 6 years ago

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 commented 5 years ago

@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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

Y probaste poniendo la fecha como numero?

On Wed, 27 Feb 2019 at 19:32 Hernan T notifications@github.com 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 https://github.com/AfipSDK/afip.php/issues/6#issuecomment-468057800, or mute the thread https://github.com/notifications/unsubscribe-auth/Aaa8Th16OXkQk8yCviW5Mvpg_3gJPsafks5vRweagaJpZM4U5pE5 .

NicoMachado commented 5 years ago

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 commented 5 years ago

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

tecnoher commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 3 years ago

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!