Commit 59915aa2 by Angel MAS

calcula impuestos

parent ef060a8c
......@@ -110,6 +110,43 @@ class Factura
return $data;
}
public function enviar()
{
$res = null;
$data_cfdi = [];
try {
$data = $this->getData();
$part_headers = ['Accept' => 'application/json', 'jsoncfdi' => json_encode($data) ];
$headers = array_merge( $this->credenciales(), $part_headers);
$randomkey = rand(5, 9999999999999999);
$client = new GuzzleClient();
$res = $client->request('POST', $this->base_url().'/cfdi/generar/'.$randomkey, [
'headers' => $headers
]);
if ($res) {
$respuesta = $res->getBody()->getContents();
$data = json_decode($respuesta, 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 $data_cfdi;
}
/**
* Obtiene la url base de la api
......@@ -135,6 +172,18 @@ class Factura
return $headers;
}
public function precioSinIva($precioConIva)
{
$data = [];
$precioSin = ($precioConIva * 100) / 116;
$iva = $precioSin * 0.16000;
$data = ['precioSin' => $precioSin, 'iva' => $iva];
return $data;
}
/**
* Devuelve el arreglo con los datos correctos
* @return Array
......@@ -145,6 +194,175 @@ class Factura
}
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
*/
......@@ -261,7 +479,7 @@ class Factura
public function setSubTotal($SubTotal)
{
$this->SubTotal = $SubTotal;
$this->data['SubTotal'] = $SubTotal;
$this->data['SubTotal'] = number_format($SubTotal, 2, '.', '');
return $this;
}
......@@ -281,7 +499,7 @@ class Factura
public function setDescuento($Descuento)
{
$this->Descuento = $Descuento;
$this->data['Descuento'] = $Descuento;
$this->data['Descuento'] = number_format($Descuento, 2, '.', '');
return $this;
}
......@@ -341,7 +559,7 @@ class Factura
public function setTotal($Total)
{
$this->Total = $Total;
$this->data['Total'] = $Total;
$this->data['Total'] = number_format($Total, 2, '.', '');
return $this;
}
......
......@@ -14,13 +14,14 @@ class FacturaConcepto
private $ValorUnitario;
private $Importe;
private $Descuento;
private $Impuesto;
private $Impuesto='002';
private $ImpuestoBase;
private $ImpuestoTipoFactor;
private $ImpuestoTasaOCuota;
private $ImpuestoTipoFactor='Tasa';
private $ImpuestoTasaOCuota='0.160000';
private $ImpuestoImporte;
private $data;
private $traslado;
private $CalculoManual = false;
/**
* @return mixed
......@@ -78,7 +79,7 @@ class FacturaConcepto
public function setCantidad($Cantidad)
{
$this->Cantidad = $Cantidad;
$this->data['Cantidad'] = $Cantidad;
$this->data['Cantidad'] = number_format($Cantidad, 0, '.', '');
return $this;
}
......@@ -158,7 +159,21 @@ class FacturaConcepto
public function setValorUnitario($ValorUnitario)
{
$this->ValorUnitario = $ValorUnitario;
$this->data['ValorUnitario'] = $ValorUnitario;
$valor_final = $this->getCalculoManual() ? $this->ValorUnitario : $this->precioSinIva($ValorUnitario);
if (!$this->getCalculoManual()) {
$importe = $valor_final * $this->getCantidad();
$this->setImpuesto('002');
$this->setImpuestoTipoFactor('Tasa');
$this->setImporte($importe);
$this->setImpuestoBase($importe);
$this->setImpuestoTasaOCuota('0.160000');
$this->setImpuestoImporte($importe * $this->getImpuestoTasaOCuota());
}
$this->data['ValorUnitario'] = number_format($valor_final, 2, '.', '');
return $this;
}
......@@ -178,7 +193,7 @@ class FacturaConcepto
public function setImporte($Importe)
{
$this->Importe = $Importe;
$this->data['Importe'] = $Importe;
$this->data['Importe'] = number_format($Importe, 2, '.', '');
return $this;
}
......@@ -198,7 +213,7 @@ class FacturaConcepto
public function setDescuento($Descuento)
{
$this->Descuento = $Descuento;
$this->data['Descuento'] = $Descuento;
$this->data['Descuento'] = number_format($Descuento, 2, '.', '');
return $this;
}
......@@ -218,7 +233,7 @@ class FacturaConcepto
public function setImpuestoBase($Base)
{
$this->Base = $Base;
$this->traslado['Base'] = $Base;
$this->traslado['Base'] = number_format($Base, 2, '.', '');
return $this;
}
......@@ -278,7 +293,7 @@ class FacturaConcepto
public function setImpuestoTasaOCuota($TasaOCuota)
{
$this->TasaOCuota = $TasaOCuota;
$this->traslado['TasaOCuota'] = $TasaOCuota;
$this->traslado['TasaOCuota'] = number_format($TasaOCuota, 6, '.', '');
return $this;
}
......@@ -298,7 +313,7 @@ class FacturaConcepto
public function setImpuestoImporte($Importe)
{
$this->Importe = $Importe;
$this->traslado['Importe'] = $Importe;
$this->traslado['Importe'] = number_format($Importe, 2, '.', '');
return $this;
}
......@@ -316,4 +331,34 @@ class FacturaConcepto
]);
}
/**
* @return mixed
*/
public function getCalculoManual()
{
return $this->CalculoManual;
}
/**
* @param boolean $CalculoManual
*
* @return self
*/
public function setCalculoManual($CalculoManual)
{
$this->CalculoManual = $CalculoManual;
return $this;
}
public function precioSinIva($precioConIva)
{
$data = [];
$precioSin = $precioConIva / 1.16;
return $precioSin;
}
}
......@@ -19,6 +19,28 @@ class FacturaConceptoLista
return $this;
}
public function getTotalImpuestos()
{
$total = 0;
foreach ($this->conceptos as $concepto) {
$total = $total + $concepto['Impuestos']['Traslados'][0]['Importe'];
}
return $total;
}
public function getTotalConceptos()
{
$total = 0;
foreach ($this->conceptos as $concepto) {
$total = $total + $concepto['Importe'];
}
return $total;
}
/**
* List of items.
*
......@@ -37,11 +59,11 @@ class FacturaConceptoLista
*/
public function addConcepto($concepto)
{
if (!$this->getConceptos()) {
if (!$this->getData()) {
return $this->setConceptos(array($concepto));
} else {
return $this->setConceptos(
array_merge($this->getConceptos(), array($concepto))
array_merge($this->getData(), array($concepto))
);
}
}
......
......@@ -13,8 +13,14 @@ class FacturaImpuesto
private $data;
private $traslado;
public function getData()
public function getData($impuestos)
{
$this->setTotalImpuestosTrasladados($impuestos);
$this->setImpuesto('002');
$this->setTipoFactor('Tasa');
$this->setTasaOCuota('0.16000');
$this->setImporte($impuestos);
return array_merge($this->data, ['Traslados'=>[$this->traslado]]);
}
......@@ -34,7 +40,7 @@ class FacturaImpuesto
public function setTotalImpuestosTrasladados($TotalImpuestosTrasladados)
{
$this->TotalImpuestosTrasladados = $TotalImpuestosTrasladados;
$this->data['TotalImpuestosTrasladados'] = $TotalImpuestosTrasladados;
$this->data['TotalImpuestosTrasladados'] = number_format($TotalImpuestosTrasladados, 2, '.', '');
return $this;
}
......@@ -94,7 +100,7 @@ class FacturaImpuesto
public function setTasaOCuota($TasaOCuota)
{
$this->TasaOCuota = $TasaOCuota;
$this->traslado['TasaOCuota'] = $TasaOCuota;
$this->traslado['TasaOCuota'] = number_format($TasaOCuota, 6, '.', '');
return $this;
}
......@@ -114,7 +120,7 @@ class FacturaImpuesto
public function setImporte($Importe)
{
$this->Importe = $Importe;
$this->traslado['Importe'] = $Importe;
$this->traslado['Importe'] = number_format($Importe, 2, '.', '');
return $this;
}
}
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