Commit 665cc915 by Angel MAS

Funcionando

parent 59915aa2
......@@ -28,32 +28,18 @@ PASSWORD_FACTURA_DIGITAL=password
# Como utilizar la libreria:
Registrar los datos generales de la factura
> $factura = FacturaDigital::setSerie('F')
> ->setFolio('71278')
> ->setFecha('AUTO')
> ->setFormaPago('01')
> ->setCondicionesDePago('CONDICIONES')
> ->setSubTotal('200'.00)
> ->setDescuento('50.00')
> ->setMoneda('MXN')
> ->setTipoCambio('1')
> ->setTotal('174.00')
> ->setTipoDeComprobante('I')
> ->setMetodoPago('PUE')
> ->setLugarExpedicion('67150')
> ->setLeyendaFolio('Factura');
Configurar regimen fiscal del emisor
Configurar regimen del emisor
> $emisor = FacturaDigital::emisor()
> ->setRegimenFiscal('612')
> ->getData();
Configurar datos del receptor
Configurar la información del receptor
> $receptor = FacturaDigital::receptor()
> ->setRfc('NDI120326HF5')
> ->setNombre('Novatech Digital SA de CV')
> ->setNumRegIdTrib('')
> //->setNumRegIdTrib('')
> ->setUsoCFDI('G03')
> ->setCalle('Palmas')
> ->setNoExt('129')
......@@ -64,65 +50,111 @@ Configurar datos del receptor
> ->setCodigoPostal('98000')
> ->getData();
Registrar los conceptos a facturar
Registrar los conceptos de la factura
> $concepto = FacturaDigital::concepto()
> ->setClaveProdServ('01010101')
> ->setNoIdentificacion('01')
> ->setCantidad('1.00')
> ->setCantidad('3.00')
> ->setClaveUnidad('KGM')
> ->setUnidad('Kilo')
> ->setDescripcion('Pantalla LSC Sharp')
> ->setValorUnitario('100.00')
> ->setImporte('100')
> ->setDescuento('25')
> ->setImpuestoBase('75.00')
> ->setImpuesto('002')
> ->setImpuestoTipoFactor('Tasa')
> ->setImpuestoTasaOCuota('0.160000')
> ->setImpuestoImporte('12.00')
> ->setDescripcion('Coca cola')
> ->setValorUnitario('15')
> ->getData();
> $concepto2 = FacturaDigital::concepto()
> ->setClaveProdServ('01010101')
> ->setNoIdentificacion('02')
> ->setCantidad('1.00')
> ->setCantidad('2')
> ->setClaveUnidad('KGM')
> ->setUnidad('PZA')
> ->setDescripcion('Memoria USB')
> ->setValorUnitario('100.00')
> ->setImporte('100.00')
> ->setDescuento('25.00')
> ->setImpuestoBase('75.00')
> ->setImpuesto('002')
> ->setImpuestoTipoFactor('Tasa')
> ->setImpuestoTasaOCuota('0.16000')
> ->setImpuestoImporte('12.00')
> ->setDescripcion('Hamburgruesa')
> ->setValorUnitario('70')
> ->getData();
Agregar los conceptos a la lista
> $lista = FacturaDigital::listaConceptos()
> ->setConceptos(array($concepto, $concepto2))
> $concepto3 = FacturaDigital::concepto()
> ->setClaveProdServ('01010101')
> ->setNoIdentificacion('03')
> ->setCantidad('3')
> ->setClaveUnidad('KGM')
> ->setUnidad('PZA')
> ->setDescripcion('Alitas Personal')
> ->setValorUnitario('50')
> ->getData();
Agregar a la lista de los conceptos
> $lista = FacturaDigital::listaConceptos();
> $lista->setConceptos(array($concepto, $concepto2, $concepto3));
Obtener los totales (Impuestos y conceptos libres de impuestos)
> $totales = $lista->getTotalConceptos();
> retorna ['totalConceptos', 'totalImpuestos']
Registrar datos generales de la factura
> $factura = FacturaDigital::setSerie('F')
> ->setFolio('71278')
> ->setFecha('AUTO')
> ->setFormaPago('01')//01 Efectivo
> ->setCondicionesDePago('Pago de contado')
> ->setMoneda('MXN')
> ->setTipoCambio('1')
> ->setTipoDeComprobante('I')
> ->setMetodoPago('PUE')
> ->setLugarExpedicion('67150') //C.P.
> ->setLeyendaFolio('Factura')
> ->setSubTotal($totales['totalConceptos'])
> //->setDescuento('30.00')
> ->setTotal($totales['totalConceptos'] + $totales['totalImpuestos'] );
Registrar impuesto total
Agregar información del impuesto
> $impuesto = FacturaDigital::impuesto()
> ->setTotalImpuestosTrasladados('24.00')
> ->setImpuesto('002')
> ->setTipoFactor('Tasa')
> ->setTasaOCuota('0.16000')
> ->setImporte('24.00')
> ->getData();
> ->getData($totales['totalImpuestos']);
Agregar todos los datos a la factura
Agregar los atributos anteriores a la factura final
> $factura->setEmisor($emisor);
> $factura->setReceptor($receptor);
> $factura->setConceptos($lista);
> $factura->setConceptos($lista->getData());
> $factura->setImpuestos($impuesto);
Leer datos de la factura
> $factura->getData();
Enviar la factura
> $factura->enviar();
\ No newline at end of file
Generar factura
> $factura_final = $factura->enviar();
retorna el siguiente arreglo
> {
> mensaje: "Timbrado exitoso",
> codigo: 200,
> cfdi:
> {
> NoCertificado: "",
> UUID: "",
> FechaTimbrado: "2018-06-28T16:33:27",
> RfcProvCertif: "FEL100622S88",
> SelloCFD:"",
> NoCertificadoSAT: "20001000000300022323",
> SelloSAT: "",
> CadenaOrigTFD: "",
> CadenaQR: "",
> XmlBase64: "",
> PDF: "",
> XML: ""
> }
> }
Enviar factura por correo
> $enviar = $factura->enviarCorreo($uuid, '[email protected]');
Esto retorna un booleano
> if ($enviar) {
> return "Factura enviada por correo";
> } else {
> return "Errorsillo";
> }
Para cancelar un CFDI
> $cancela = $factura->cancelarCFDI('UUID');
\ No newline at end of file
......@@ -110,6 +110,10 @@ class Factura
return $data;
}
/**
* Genera la factura obteniendo los datos capturados
* @return array Devuelve ligas de la factura e identificador
*/
public function enviar()
{
$res = null;
......@@ -147,6 +151,100 @@ class Factura
return $data_cfdi;
}
/**
* enviarCorreo Envia la factura al correo indicado
* @param string $uuid identificador de la factura enviar
* @param string $destinatario correo del receptor de la factura
* @return boolean Devuelve verdadero si la transaccion fue existosa
*/
public function enviarCorreo($uuid, $destinatario)
{
$res = null;
$data_cfdi = [];
$response = false;
try {
$part_headers = [
'Accept' => 'application/json',
'uuid'=> $uuid,
'destinatario' => $destinatario,
'mensaje' => 'Hello World'
];
$headers = array_merge( $this->credenciales(), $part_headers);
$client = new GuzzleClient();
$res = $client->request('POST', $this->base_url().'/cfdi/correo', [
'headers' => $headers
]);
if ($res) {
$respuesta = $res->getBody()->getContents();
//dd($respuesta);
$data = json_decode($respuesta, true);
$response = true;
$data_cfdi = $data;
} else {
return "Error api";
}
} catch (\GuzzleHttp\Exception\ClientException $e) {
//dd($e->getResponse()->getBody()->getContents());
$error = json_decode($e->getResponse()->getBody()->getContents());
$error = (array)$error;
$data_cfdi = $error;
}
return $response;
}
/**
* Cancela cfdis
* @param string $uuid Identificador de la factura
* @return array respuesta de la cancelacion $array['mensaje']
*/
public function cancelarCFDI($uuid)
{
$res = null;
$data_cfdi = [];
try {
$part_headers = [
'Accept' => 'application/json',
'uuid'=> $uuid,
];
$headers = array_merge( $this->credenciales(), $part_headers);
$client = new GuzzleClient();
$res = $client->request('POST', $this->base_url().'/cfdi/cancelar', [
'headers' => $headers
]);
if ($res) {
$respuesta = $res->getBody()->getContents();
//dd($respuesta);
$data = json_decode($respuesta, true);
//dd($data);
$data_cfdi = $data;
} else {
return "Error api";
}
} catch (\GuzzleHttp\Exception\ClientException $e) {
//dd($e->getResponse()->getBody()->getContents());
$error = json_decode($e->getResponse()->getBody()->getContents());
$error = (array)$error;
$data_cfdi = $error;
}
//dd($data_cfdi);
return $data_cfdi;
}
/**
* Obtiene la url base de la api
......@@ -193,176 +291,6 @@ class Factura
return $this->data;
}
public function test()
{
# llenamos los datos de nuestro CFDI
# crearemos un xml de prueba
$d = array();
#$d['printxml'] = true; # nos permite imprimir el xml generado para debug
# datos basicos SAT
$d['Serie'] = 'F';
$d['Folio'] = '987750'; #'101';
$d['Fecha'] = 'AUTO';
$d['FormaPago'] = '01';
$d['CondicionesDePago'] = 'CONDICIONES';
$d['SubTotal'] = '200.00';
$d['Descuento'] = '50.00'; # o bien: null
$d['Moneda'] = 'MXN';
$d['TipoCambio'] = 1;
$d['Total'] = '174.00';
$d['TipoDeComprobante'] = 'I';
$d['MetodoPago'] = 'PUE';
$d['LugarExpedicion'] = '67150';
# opciones de personalización (opcionales)
$d['LeyendaFolio'] = "FACTURA"; # leyenda opcional para poner a lado del folio: FACTURA, RECIBO, NOTA DE CREDITO, ETC.
# codigo de confirmación PAC para cfdis mayores a $20 millones
# $d['Confirmacion'] = null;
# CFDIs relacionados
# $d['CfdiRelacionados']['TipoRelacion'] = null;
# $d['CfdiRelacionados'][0]['UUID'] = null;
# Regimen fiscal del emisor ligado al tipo de operaciones que representa este CFDI
$d['Emisor']['RegimenFiscal'] = '615'; # ver catálogo del SAT
# Datos del receptor
$d['Receptor']['Rfc'] = 'NDI120326HF5';
$d['Receptor']['Nombre'] = 'Novatech Digital SA de CV';
# $d['Receptor']['ResidenciaFiscal'] = 'MEX'; # solo se usa cuando el receptor no esté dado de alta en el SAT
$d['Receptor']['NumRegIdTrib'] = ''; # para extranjeros
$d['Receptor']['UsoCFDI'] = 'G03'; # uso que le dará el cliente al cfdi
# Receptor -> Domicilio (OPCIONAL)
$d["Receptor"]["Calle"] = "Palmas";
$d["Receptor"]["NoExt"] = "9810";
#$d["Receptor"]["NoInt"] = null;
$d["Receptor"]["Colonia"] = "Anahuac";
#$d["Receptor"]["Localidad"] = null;
#$d["Receptor"]["Referencia"] = null;
$d["Receptor"]["Municipio"] = "Apodaca";
$d["Receptor"]["Estado"] = "Nuevo Leon";
$d["Receptor"]["Pais"] = "México";
$d["Receptor"]["CodigoPostal"] = "67349";
# >> conceptos <<
# concepto 1
$d['Conceptos'][0]['ClaveProdServ'] = '01010101';
$d['Conceptos'][0]['NoIdentificacion'] = '01'; #codigo interno o SKU, GTIN, codigo de barras, etc.
$d['Conceptos'][0]['Cantidad'] = 1.00;
$d['Conceptos'][0]['ClaveUnidad'] = 'KGM'; # Clave SAT
$d['Conceptos'][0]['Unidad'] = 'Kilo'; # Unidad de Medida
$d['Conceptos'][0]['Descripcion'] = 'PANTALLA LCD SHARP'; #maximo 1000 caracteres
$d['Conceptos'][0]['ValorUnitario'] = '100.00';
$d['Conceptos'][0]['Importe'] = '100.00';
$d['Conceptos'][0]['Descuento'] = '25.00'; # no se permiten valores negativos
# concepto 1 -> impuestos
$d['Conceptos'][0]['Impuestos']['Traslados'][0]['Base'] = '75.00';
$d['Conceptos'][0]['Impuestos']['Traslados'][0]['Impuesto'] = '002';
$d['Conceptos'][0]['Impuestos']['Traslados'][0]['TipoFactor'] = 'Tasa';
$d['Conceptos'][0]['Impuestos']['Traslados'][0]['TasaOCuota'] = '0.160000';
$d['Conceptos'][0]['Impuestos']['Traslados'][0]['Importe'] = '12.00';
$d['Conceptos'][1]['ClaveProdServ'] = '01010101';
$d['Conceptos'][1]['NoIdentificacion'] = '01'; #codigo interno o SKU, GTIN, codigo de barras, etc.
$d['Conceptos'][1]['Cantidad'] = 1.00;
$d['Conceptos'][1]['ClaveUnidad'] = 'KGM'; # Clave SAT
$d['Conceptos'][1]['Unidad'] = 'PZA'; # Unidad de Medida
$d['Conceptos'][1]['Descripcion'] = 'MEMORIA USB'; #maximo 1000 caracteres
$d['Conceptos'][1]['ValorUnitario'] = '100.00';
$d['Conceptos'][1]['Importe'] = '100.00';
$d['Conceptos'][1]['Descuento'] = '25.00';
$d['Conceptos'][1]['Impuestos']['Traslados'][0]['Base'] = '75.00';
$d['Conceptos'][1]['Impuestos']['Traslados'][0]['Impuesto'] = '002';
$d['Conceptos'][1]['Impuestos']['Traslados'][0]['TipoFactor'] = 'Tasa';
$d['Conceptos'][1]['Impuestos']['Traslados'][0]['TasaOCuota'] = '0.160000';
$d['Conceptos'][1]['Impuestos']['Traslados'][0]['Importe'] = '12.00';
/*
$d['Concepto'][0]['Impuestos']['Retenciones'][0]['Base'] = 1;
$d['Concepto'][0]['Impuestos']['Retenciones'][0]['Impuesto'] = '002';
$d['Concepto'][0]['Impuestos']['Retenciones'][0]['TipoFactor'] = 'Tasa';
$d['Concepto'][0]['Impuestos']['Retenciones'][0]['TasaOCuota'] = 16.000;
$d['Concepto'][0]['Impuestos']['Retenciones'][0]['Importe'] = 150.00;
*/
/*
$d['Concepto'][0]['InformacionAduanera'][0]['NumeroPedimento'] = '10 47 4344 8783676';
$d['Concepto'][0]['InformacionAduanera'][1]['NumeroPedimento'] = '10 47 6564 1197423';
*/
# concepto 2
#$d['Conceptos'][1]['ClaveProdServ'] = '01010101';
#$d['Conceptos'][1]['NoIdentificacion'] = '01'; #codigo interno o SKU, GTIN, codigo de barras, etc.
#$d['Conceptos'][1]['Cantidad'] = 1.00;
#$d['Conceptos'][1]['ClaveUnidad'] = 'F52';
#$d['Conceptos'][1]['Unidad'] = 'TONELADA';
#$d['Conceptos'][1]['Descripcion'] = 'ESTRUCTURA DE ACERO INOXIDABLE SKX478'; #maximo 1000 caracteres
#$d['Conceptos'][1]['ValorUnitario'] = 500.00;
#$d['Conceptos'][1]['Importe'] = 500.00; # solo valores positivos si el tipo de comprobante es "I", "E", "N". Si es "T" puede ser mayor o igual a cero. Si es "P" (Pago), debe ser cero forzosamente.
#Conceptos$d['Concepto'][1]['Descuento'] = null; # no se permiten valores negativos
# concepto 2 -> impuestos
/*
$d['Concepto'][1]['Impuestos']['Traslados'][0]['Base'] = 1;
$d['Concepto'][1]['Impuestos']['Traslados'][0]['Impuesto'] = 'IVA';
$d['Concepto'][1]['Impuestos']['Traslados'][0]['TipoFactor'] = 'Tasa';
$d['Concepto'][1]['Impuestos']['Traslados'][0]['TasaOCuota'] = 1;
$d['Concepto'][1]['Impuestos']['Traslados'][0]['Importe'] = 85.00;
$d['Concepto'][1]['Impuestos']['Traslados'][1]['Base'] = 2;
$d['Concepto'][1]['Impuestos']['Traslados'][1]['Impuesto'] = 'ISR';
$d['Concepto'][1]['Impuestos']['Traslados'][1]['TipoFactor'] = 'Tasa';
$d['Concepto'][1]['Impuestos']['Traslados'][1]['TasaOCuota'] = 1;
$d['Concepto'][1]['Impuestos']['Traslados'][1]['Importe'] = 240.00;
$d['Concepto'][1]['Impuestos']['Traslados'][2]['Base'] = 2;
$d['Concepto'][1]['Impuestos']['Traslados'][2]['Impuesto'] = 'IEPS';
$d['Concepto'][1]['Impuestos']['Traslados'][2]['TipoFactor'] = 'Tasa';
$d['Concepto'][1]['Impuestos']['Traslados'][2]['TasaOCuota'] = 1;
$d['Concepto'][1]['Impuestos']['Traslados'][2]['Importe'] = 150.00;
$d['Concepto'][1]['Impuestos']['Retenciones'][0]['Base'] = 2;
$d['Concepto'][1]['Impuestos']['Retenciones'][0]['Impuesto'] = 'IVA';
$d['Concepto'][1]['Impuestos']['Retenciones'][0]['TipoFactor'] = 'Tasa';
$d['Concepto'][1]['Impuestos']['Retenciones'][0]['TasaOCuota'] = 1;
$d['Concepto'][1]['Impuestos']['Retenciones'][0]['Importe'] = 150.00;
$d['Concepto'][1]['InformacionAduanera'][0]['NumeroPedimento'] = '10 47 3807 8003832';
$d['Concepto'][1]['InformacionAduanera'][1]['NumeroPedimento'] = '10 47 3807 4322343';
$d['Concepto'][1]['CuentaPredial']['Numero'] = '4328942809'; */
# Impuestos
#$d['Impuestos']['TotalImpuestosRetenidos'] = 0.000000;
$d['Impuestos']['TotalImpuestosTrasladados'] = '24.00';
# Definimos a detalle las retenciones
#$d['Impuestos']['Retenciones'][0]['Impuesto'] = '001'; # 001=ISR, 002=IVA, 003=IEPS
#$d['Impuestos']['Retenciones'][0]['Importe'] = 0.00;
# Definimos a detalle los traslados
$d['Impuestos']['Traslados'][0]['Impuesto'] = '002'; # 001=ISR, 002=IVA, 003=IEPS
$d['Impuestos']['Traslados'][0]['TipoFactor'] = 'Tasa';
$d['Impuestos']['Traslados'][0]['TasaOCuota'] = '0.160000'; # 16%
$d['Impuestos']['Traslados'][0]['Importe'] = '24.00'; # Monto
return $d;
}
/**
* @return mixed
*/
......
......@@ -33,12 +33,14 @@ class FacturaConceptoLista
public function getTotalConceptos()
{
$total = 0;
$totalImpuestos = 0;
foreach ($this->conceptos as $concepto) {
$total = $total + $concepto['Importe'];
$totalImpuestos = $totalImpuestos + $concepto['Impuestos']['Traslados'][0]['Importe'];
}
return $total;
return ['totalConceptos' => $total, 'totalImpuestos' => $totalImpuestos];
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment