New question

Question:

Date: 24-07-2020 15:44:47 (In Spanish)

Factura Electrónica Argentina (AFIP): problema con Notas de Crédito y Notas de Débito (comprobantes asociados)[Unresolved]

Buenas tardes.
Tengo implementada la factura electrónica en mi sistema de facturación y cobranzas con el desarrollo de Pablo, y anda muy bien. Mi sistema esta desarrollado en COBOL, el mismo genera el archivo factura.php y mediante un include('factura.php'); en el index.php le paso las variables que necesita el wsfev1.class.php para el pedido a afip.
Les aclaro que soy programador COBOL con muy poca experiencia en PHP.
A partir del 1 de julio, empece a tener problemas en las Notas de Crédito y Notas de Débito y según me comentaba un contador, la afip esta afinando las validaciones en en los web service.
Revisando los distintos archivos php de la aplicación, encuentro en el index.php lo siguiente:

// Comprobantes asociados (solo notas de crédito y débito):
//$regfeasoc['Tipo'] = 91; //91; //tipo 91|5			
//$regfeasoc['PtoVta'] = 1;
//$regfeasoc['Nro'] = 1;


están comentadas las variable del array ($regfeasoc) correspondientes a comprobantes asociados que son necesarios para que las NC y ND informen los comprobantes afectados.
En el llamado al pedido de cae ya viene incluido este array ($cae = $wsfev1->FECAESolicitar($nro1, $ptovta, $regfe, $regfeasoc, $regfetrib,$regfeiva)
Entonces, habilito este vector con lo siguiente:


// esto solo se ejecuta si viene la variable $cbteasoc en el archivo factura.php
if (isset ($cbteasoc)){
// Comprobantes asociados (solo notas de crédito y débito):
   $regfeasoc['Tipo'] = $tipocbteasoc;
   $regfeasoc['PtoVta'] = $ptovta;
   $regfeasoc['Nro'] = $cbteasoc;
    }


Después de agregar esto, seguía con el problema, el web service me respondía que tenia que informar los comprobantes afectados. Entonces, revisando el wsfev1.class.php veo que no contempla este array para la generación del XML del pedido, entonces le agrego lo siguiente:

'CbtesAsoc' =>
	array( 'CbteAsoc' =>
        array ('Tipo' => $regfeasoc['Tipo'],
	          'PtoVta' => $regfeasoc['PtoVta'],
	          'Nro' => $regfeasoc['Nro'] ),),


con este agregado, todo bien, el pedido de cae para NC y ND me lo da perfecto.
El problema lo tengo ahora para facturas y recibos, con este agregado el request-FECAESolicitar.xml me lo genera con el siguiente error:
<ns1:CbtesAsoc>
<ns1:CbteAsoc>
<ns1:Tipo/>
<ns1:PtoVta/>
<ns1:Nro/>
</ns1:CbteAsoc>
</ns1:CbtesAsoc>

y no encuentro la forma de arreglar este problema.
Disculpen lo extenso de mi exposición, pero quería hacerme entender bien.
Saludos
Tags: Billing - Electronic Invoice - PHP - Question - Webservices - XML Votes: 0 - Answers: 12 - Views: 17 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 20-08-2020 05:50:23 Julio. en FECAESolicitar arma un switch respecto del tipo de comprobante,

    switch( tipo_de_comprobante){
    case 3:
    case 8:
    ......./// y los que representen NC o ND

    la rutina con el agregado de los comprobantes asociados

    default:

    la misma rutina pero sin el agregado del array asoc

    }

    asi te va a funcionar
      Votes: 0 - Link answer
     
  • Date: 18-07-2021 06:10:45 Hola JULIO HECTOR JACOMO, estoy comenzando a desroolar un sistema de facturacion online (AFIP argentina) cual es el sistema de pablo, de donde lo bajaste? me gustaria esa info si es posible Gracias de antemano, saludos!!   Votes: 0 - Link answer
     
  • Date: 27-06-2022 16:40:06 Hola, buenas noches gente.
    Como dije en mis posteos anteriores, soy programador COBOL con poca experiencia en PHP, adapte al COBOL la solución de Pablo para la factura electrónica y anda muy bien. A mi problema antes comentado sobre Notas de Crédito y Notas de Debito encontré una solución temporal (para siempre...) que es la de disponer una terminal del cliente SOLO para estos comprobantes, pero ahora me tocó un cliente que tiene una sola caja y desde ahí tiene que emitir cualquier comprobante. Le agradezco a Carlos Ferro su respuesta, me cuesta implementarla por la poca experiencia en PHP, pero me pareció mas simple usar lo siguiente después del armado de la variable $params:

    if (isset($cbteasoc))
    {$params .= 'CbtesAsoc' =>
    array( 'CbteAsoc' =>
    array ('Tipo' => $regfeasoc['Tipo'],
    'PtoVta' => $regfeasoc['PtoVta'],
    'Nro' => $regfeasoc['Nro']
    )
    )
    }
    Pero esta líneas tienen un error de sintaxis que no logro descubrir, si las comento (//) pasa bien, agradecería su colaboración para poder avanzar en esto.

    Pedro Osinaga, disculpas por no contesta en tiempo y forma, seguramente con la ayuda de este foro pudiste salir adelante, si te puedo ayudar en algo avísame, estaré atento.

    Saludos.
    Julio Jacomo
    San Juan - Argentina.
      Votes: 0 - Link answer
     
  • Date: 28-06-2022 04:22:36 Julio. a esta altura ya lo reformule, ahora me quedo asi



    public function FECAESolicitar($cbte, $ptovta, $regfe, $regfeasoc, $regfetrib, $regfeiva, $opcionales)

    {
    if ($cbte<1) $cbte=1;

    $params = array(
    'Auth' =>
    array( 'Token' => $this->TA->credentials->token,
    'Sign' => $this->TA->credentials->sign,
    'Cuit' => self::CUIT ),
    'FeCAEReq' =>
    array( 'FeCabReq' =>
    array( 'CantReg' => 1,
    'PtoVta' => $ptovta,
    'CbteTipo' => $regfe['CbteTipo'] ),
    'FeDetReq' =>
    array( 'FECAEDetRequest' =>
    array( 'Concepto' => $regfe['Concepto'],
    'DocTipo' => $regfe['DocTipo'],
    'DocNro' => $regfe['DocNro'],
    'CbteDesde' => $cbte,
    'CbteHasta' => $cbte,
    'CbteFch' => $regfe['CbteFch'],
    'ImpNeto' => $regfe['ImpNeto'],
    'ImpTotConc' => $regfe['ImpTotConc'],
    'ImpIVA' => $regfe['ImpIVA'],
    'ImpTrib' => $regfe['ImpTrib'],
    'ImpOpEx' => $regfe['ImpOpEx'],
    'ImpTotal' => $regfe['ImpTotal'],
    'FchServDesde' => $regfe['FchServDesde'], //null
    'FchServHasta' => $regfe['FchServHasta'], //null
    'FchVtoPago' => $regfe['FchVtoPago'], //null
    'MonId' => $regfe['MonId'], //PES
    'MonCotiz' => $regfe['MonCotiz'], //1
    'CbtesAsoc' => $regfeasoc,
    'Tributos' =>
    array( 'Tributo' =>
    array ( 'Id' => $regfetrib['Id'],
    'Desc' => $regfetrib['Desc'],
    'BaseImp' => $regfetrib['BaseImp'],
    'Alic' => $regfetrib['Alic'],
    'Importe' => $regfetrib['Importe'] ),
    ),

    'Iva' => $regfeiva,
    'Opcionales' => $opcionales,


    ),
    ),
    ),
    );



    $results = $this->client->FECAESolicitar($params);

    $e = $this->_checkErrors($results, 'FECAESolicitar');

    //asigno respuesta
    $resp_cae = $results->FECAESolicitarResult->FeDetResp->FECAEDetResponse->CAE;
    $resp_caefvto = $results->FECAESolicitarResult->FeDetResp->FECAEDetResponse->CAEFchVto;

    return $e == false ? Array( 'cae' => $resp_cae, 'fecha_vencimiento' => $resp_caefvto ): false;
    } //end function FECAESolicitar


    En esta solucion lo que hago es enviarle el array con la estructura ya confeccionada y entre ellos como ves tambien estan los comprobantes asociados para el caso de NC o ND. y factura de credito

    -/*** $regfeasoc *****/// en esta variable me llega el tipo de comprobante( el codigo AFIP) , y lo dejo en null si es una factura comun o creo el array con su estructura sea nd, Nc o Factura mipyme ( que va en opcionales )


    // Comprobantes asociados (solo notas de crédito y débito):
    // ********** 25/02/2020 *** Ver. 2.16 * 15/08/2021 Ver. 3
    // verifico si es NC.
    $regfeasoc=null; // sin comprobante asociado
    if ($tipocbte==3 || $tipocbte==8 ) {

    $regfeasoc= array( 'CbteAsoc' =>
    array ( 'Tipo' => intval($row['tipo_comp_asoc']),
    'PtoVta' => $row['pto_venta'],
    'Nro' => $row['numero_comp_asoc']
    ),
    );

    // $regfeasoc['Tipo'] = intval($row['tipo_comp_asoc']); // Para 3 -> 1 // para 8 -> 6
    // $regfeasoc['PtoVta'] =$row['pto_venta']; // el mismo del documento !
    // $regfeasoc['Nro'] = $row['numero_comp_asoc'];
    // $regfeasoc['Cuit'] = 1; // es obligatorio en factura de Credito
    // $regfeasoc['CbteFch'] = 1; // es obligatorio en factura de Credito

    }
    // Factura de Credito Mipyme:
    // * 15/08/2021 Ver. 3 ///*** cuit_asoc es el CBU */
    $opcionales=null;
    if ($tipocbte==201 || $tipocbte==206 ) {

    $opcionales= array (
    array (
    'Id' => 2101,
    'Desc' => 'Factura de Crédito Electrónica MiPyMEs (FCE) ',
    'Valor' => $row['cuit_asoc'] ),

    array(
    'Id' => 27,
    'Desc' => 'Factura de Crédito Electrónica MiPyMEs (FCE) - Transmision',
    'Valor' => 'SCA',

    ),
    );



    $regfe['FchVtoPago']=date('Ymd'); // es obligatorio;


    }
    y asi resuelto lo envio a FECAESolicitar
      Votes: 0 - Link answer
     
  • Date: 30-06-2022 13:41:43 Hola Carlos, gracias por tu respuesta, ahora lo pruebo, seria reemplazar public function FECAESolicitar, hasta el final por tu aporte?
    Saludos
      Votes: 0 - Link answer
     
  • Date: 30-06-2022 15:29:48 Julio , si es así , pero ojo con el iva, que ahí no esta la rutina que crea el array segun la cantidad de alícuotas, esa parte la deberías dejar como la tengas resuelta   Votes: 0 - Link answer
     
  • Date: 30-06-2022 16:36:39 Carlos, estuve probando lo tuyo y creo que en algo me equivoqué, no encuentro la solución, esta es la respuesta que obtengo:

    ( ! ) Fatal error: Uncaught TypeError: Argument 1 passed to
    exception_handler() must be an instance of Exception, instance of
    ParseError given in C:\wamp64\www\recibos\exceptionhandler.php on line
    4
    ( ! ) TypeError: Argument 1 passed to exception_handler() must be an
    instance of Exception, instance of ParseError given in
    C:\wamp64\www\recibos\exceptionhandler.php on line 4
    Call Stack
    # Time Memory Function Location
    1 0.0021 405536 exception_handler( ) ...\exceptionhandler.php:0
      Votes: 0 - Link answer
     
  • Date: 30-06-2022 16:48:17 Estoy tratando de pegar el código del modulo wsfev1.class.php y no me deja   Votes: 0 - Link answer
     
  • Date: 01-07-2022 04:05:56 Fijate bien que tiene otro juego de argumentos, distintos al original que vos tenes, fhacelos llegar en el orden que necesitas y reemplaza por los que tenes con un funcionamiento diferente   Votes: 0 - Link answer
     
  • Date: 02-07-2022 05:26:43 Buenos días Carlos, comunidad php.
    Si Carlos, me había dado cuento de ese detalle, para lo cual realice los siguientes arreglos.
    En el archivo index.php habilite y agregué las líneas siguientes:
    // Comprobante afectado por NC y ND;
    $regfeasoc['Tipo'] = $tipocbteasoc;
    $regfeasoc['PtoVta'] = $ptovta;
    $regfeasoc['Nro'] = $cbteasoc;
    // Para Factura de Credito Mipyme:
    $opcionales['Id']=$idcomproasoc;
    $opcionales['Desc']=$desccomproasoc;
    $opcionales['Valor']=$valorcomproasoc;
    

    luego en el llamado a la clase le agregué el nuevo parámetro y quedo así:
    $cae = $wsfev1->FECAESolicitar($nro1, $ptovta, $regfe, $regfeasoc, $regfetrib, $regfeiva, $opcionales);
    

    en wsfev1.class.php, reemplacé "public function FECAESolicitar" por tu aporte y con esto sigo con los problemas.
    Carlos, en primer lugar, te agradezco tus ganas y tiempo por tus aportes, este nivel de php es muy avanzado para mis conocimientos. Abrazo
      Votes: 0 - Link answer
     
  • Date: 02-07-2022 05:29:29 Te recuerdo la forma de usar estas soluciones php.
    Mi sistemas COBOL genera el archivo factura.php con todas las variables necesarias para el pedido de cae:
    En el archivo index.php le agreguo "include('factura.php');" en su cabecera y luego el cobol llama a un navegador, ejecuta el index.php y recoge las respuestas en un archivo txt para su análisis.
    La duda mi es en lo siguiente, en tu aporte tengo lo siguiente:
    if ($tipocbte==3 || $tipocbte==8 )
               {$regfeasoc= array( 'CbteAsoc' =>
                               array ( 'Tipo' => intval($row['tipo_comp_asoc']),
                                       'PtoVta' => $row['pto_venta'],
                                       'Nro' => $row['numero_comp_asoc']),
                                 );
    
                }
    

    Viendo esto, entiendo que las tres variable son vectores que deberían estar definidas como tal y no se como hacerlo.
      Votes: 0 - Link answer
     
  • Date: 04-07-2022 03:25:51 Julio, esas no son vectores , son campos del registro de la base de datos que estoy leyendo, porque en esa rutina que te pase el sistema primero registra el comprobante en la base de datos y después va por el cae   Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com