Exemple #1
0
 public function validateCfdi(CfdiFactura $cfdi)
 {
     $emisor = $cfdi->emisor();
     if (!$emisor) {
         $cfdi->delete();
         throw new CfdiException("El emisor de la factura (Cfdi) no ha sido definido.");
     }
     $receptor = $cfdi->receptor();
     if (!$receptor) {
         $cfdi->delete();
         throw new CfdiException("El receptor de la factura (Cfdi) no ha sido definido.");
     }
     $conceptos = $cfdi->conceptos();
     if (count($conceptos) == 0) {
         $cfdi->delete();
         throw new CfdiException("La factura (Cfdi) debe contener al menos un concepto que facturar.");
     }
     $regimenes = $cfdi->regimenes();
     if (count($regimenes) == 0) {
         $cfdi->delete();
         throw new CfdiException("La factura (Cfdi) debe contener al menos un regimen del contribuyente.");
     }
 }
 public function __construct(CfdiFactura $cfdi)
 {
     $this->cfdi = $cfdi;
     //Comprobante
     $comprobante = new CfdiNodo("cfdi:Comprobante");
     $comprobante->agregarAtributo("xsi:schemaLocation", "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
     $comprobante->agregarAtributo("xsi:schemaLocation", "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
     $comprobante->agregarAtributo("xmlns:cfdi", "http://www.sat.gob.mx/cfd/3");
     $comprobante->agregarAtributo("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
     $comprobante->agregarAtributo("version", "3.2");
     if ($cfdi->serie) {
         $comprobante->agregarAtributo("serie", $cfdi->serie);
     }
     if ($cfdi->folio) {
         $comprobante->agregarAtributo("folio", $cfdi->folio);
     }
     $comprobante->agregarAtributo("fecha", date("Y-m-d") . "T" . date("H:i:s"));
     $comprobante->agregarAtributo("formaDePago", "PAGO EN UNA SOLA EXHIBICION");
     $comprobante->agregarAtributo("total", number_format($cfdi->total, 4, ".", ""));
     $comprobante->agregarAtributo("subTotal", number_format($cfdi->subTotal, 4, ".", ""));
     if ($cfdi->descuento > 0) {
         $comprobante->agregarAtributo("descuento", number_format($cfdi->descuento, 4, ".", ""));
         $comprobante->agregarAtributo("motivoDescuento", $cfdi->motivoDescuento ? $cfdi->motivoDescuento : "Descuento General");
     }
     $comprobante->agregarAtributo("LugarExpedicion", "MÉXICO");
     $comprobante->agregarAtributo("metodoDePago", $cfdi->metodoPago ? $cfdi->metodoPago : "NO IDENTIFICADO");
     $comprobante->agregarAtributo("tipoDeComprobante", $cfdi->tipoDeComprobante ? strtolower($cfdi->tipoDeComprobante) : "ingreso");
     if (isset($cfdi->numCtaPago) && $cfdi->numCtaPago) {
         $comprobante->agregarAtributo("numCtaPago", $cfdi->numCtaPago ? substr($cfdi->numCtaPago, strlen($cfdi->numCtaPago) - 4) : "");
     }
     if (isset($cfdi->moneda) && $cfdi->moneda) {
         $comprobante->agregarAtributo("moneda", $cfdi->moneda ? $cfdi->moneda : "");
     }
     if (isset($cfdi->tipoCambio) && $cfdi->tipoCambio && $cfdi->tipoCambio != 1) {
         $comprobante->agregarAtributo("tipoCambio", $cfdi->tipoCambio ? number_format($cfdi->tipoCambio, 2, ".", "") : "");
     }
     $cfdi_emisor = $cfdi->emisor();
     //Emisor
     $emisor = new CfdiNodo("cfdi:Emisor");
     $emisor->agregarAtributo("rfc", $cfdi_emisor->rfc);
     $emisor->agregarAtributo("nombre", $cfdi_emisor->nombre);
     $comprobante->agregarNodo($emisor);
     //Emisor - Domicilio Fiscal
     $domicilioFiscal = new CfdiNodo("cfdi:DomicilioFiscal");
     if ($cfdi_emisor->calle) {
         $domicilioFiscal->agregarAtributo("calle", $cfdi_emisor->calle);
     }
     if ($cfdi_emisor->noExterior) {
         $domicilioFiscal->agregarAtributo("noExterior", $cfdi_emisor->noExterior);
     }
     if ($cfdi_emisor->noInterior) {
         $domicilioFiscal->agregarAtributo("noInterior", $cfdi_emisor->noInterior);
     }
     if ($cfdi_emisor->colonia) {
         $domicilioFiscal->agregarAtributo("colonia", $cfdi_emisor->colonia);
     }
     if ($cfdi_emisor->municipio) {
         $domicilioFiscal->agregarAtributo("municipio", $cfdi_emisor->municipio);
     }
     if ($cfdi_emisor->estado) {
         $domicilioFiscal->agregarAtributo("estado", $cfdi_emisor->estado);
     }
     if ($cfdi_emisor->pais) {
         $domicilioFiscal->agregarAtributo("pais", $cfdi_emisor->pais);
     }
     if ($cfdi_emisor->codigoPostal) {
         $domicilioFiscal->agregarAtributo("codigoPostal", $cfdi_emisor->codigoPostal);
     }
     $emisor->agregarNodo($domicilioFiscal);
     //Emisor - Expedido En
     //Si hay sucursales, sacar datos de la sucursal, sino salen del contribuyente
     $expedioEn = new CfdiNodo("cfdi:ExpedidoEn");
     if ($cfdi_emisor->calle) {
         $expedioEn->agregarAtributo("calle", $cfdi_emisor->calle);
     }
     if ($cfdi_emisor->noExterior) {
         $expedioEn->agregarAtributo("noExterior", $cfdi_emisor->noExterior);
     }
     if ($cfdi_emisor->noInterior) {
         $expedioEn->agregarAtributo("noInterior", $cfdi_emisor->noInterior);
     }
     if ($cfdi_emisor->colonia) {
         $expedioEn->agregarAtributo("colonia", $cfdi_emisor->colonia);
     }
     if ($cfdi_emisor->municipio) {
         $expedioEn->agregarAtributo("municipio", $cfdi_emisor->municipio);
     }
     if ($cfdi_emisor->estado) {
         $expedioEn->agregarAtributo("estado", $cfdi_emisor->estado);
     }
     if ($cfdi_emisor->pais) {
         $expedioEn->agregarAtributo("pais", $cfdi_emisor->pais);
     }
     if ($cfdi_emisor->codigoPostal) {
         $expedioEn->agregarAtributo("codigoPostal", $cfdi_emisor->codigoPostal);
     }
     $emisor->agregarNodo($expedioEn);
     //Emisor - Regimenes Fiscales
     $cfdi_regimenes = $cfdi->regimenes();
     if ($cfdi_regimenes) {
         foreach ($cfdi_regimenes as $cfdi_regimen) {
             $regimenFiscal = new CfdiNodo("cfdi:RegimenFiscal");
             $regimenFiscal->agregarAtributo("Regimen", $cfdi_regimen->regimen);
             $emisor->agregarNodo($regimenFiscal);
         }
     }
     $cfdi_receptor = $cfdi->receptor();
     //Receptor
     $receptor = new CfdiNodo("cfdi:Receptor");
     $receptor->agregarAtributo("rfc", $cfdi_receptor->rfc);
     $receptor->agregarAtributo("nombre", $cfdi_receptor->nombre);
     $comprobante->agregarNodo($receptor);
     //Receptor - Domicilio Fiscal
     $domicilio = new CfdiNodo("cfdi:Domicilio");
     if ($cfdi_receptor->calle) {
         $domicilio->agregarAtributo("calle", $cfdi_receptor->calle);
     }
     if ($cfdi_receptor->exterior) {
         $domicilio->agregarAtributo("noExterior", $cfdi_receptor->noExterior);
     }
     if ($cfdi_receptor->interior) {
         $domicilio->agregarAtributo("noInterior", $cfdi_receptor->noInterior);
     }
     if ($cfdi_receptor->colonia) {
         $domicilio->agregarAtributo("colonia", $cfdi_receptor->colonia);
     }
     if ($cfdi_receptor->municipio) {
         $domicilio->agregarAtributo("municipio", $cfdi_receptor->municipio);
     }
     if ($cfdi_receptor->estado) {
         $domicilio->agregarAtributo("estado", $cfdi_receptor->estado);
     }
     if ($cfdi_receptor->pais) {
         $domicilio->agregarAtributo("pais", $cfdi_receptor->pais);
     }
     if ($cfdi_receptor->codigoPostal) {
         $domicilio->agregarAtributo("codigoPostal", $cfdi_receptor->codigoPostal);
     }
     $receptor->agregarNodo($domicilio);
     $cfdi_conceptos = $cfdi->conceptos();
     //Conceptos
     $conceptos = new CfdiNodo("cfdi:Conceptos");
     if ($cfdi_conceptos) {
         foreach ($cfdi_conceptos as $cfdi_concepto) {
             $concepto = new CfdiNodo("cfdi:Concepto");
             $concepto->agregarAtributo("cantidad", $cfdi_concepto->cantidad);
             $concepto->agregarAtributo("unidad", $cfdi_concepto->unidad);
             $concepto->agregarAtributo("descripcion", $cfdi_concepto->descripcion);
             $concepto->agregarAtributo("valorUnitario", number_format($cfdi_concepto->valorUnitario, 4, ".", ""));
             $concepto->agregarAtributo("importe", number_format($cfdi_concepto->importe, 4, ".", ""));
             $conceptos->agregarNodo($concepto);
         }
     }
     $comprobante->agregarNodo($conceptos);
     $cfdi_impuestos = $cfdi->impuestos();
     $total_trasladados = 0;
     $total_retenidos = 0;
     $impuestos = new CfdiNodo("cfdi:Impuestos");
     $traslados = new CfdiNodo("cfdi:Traslados");
     $retenidos = new CfdiNodo("cfdi:Retenciones");
     if ($cfdi_impuestos) {
         foreach ($cfdi_impuestos as $cfdi_impuesto) {
             if (strtoupper($cfdi_impuesto->tipo) == "TRASLADADO" || strtoupper($cfdi_impuesto->tipo) == "TRASLADO") {
                 $total_trasladados += $cfdi_impuesto->importe;
                 $traslado = new CfdiNodo("cfdi:Traslado");
                 $traslado->agregarAtributo("tasa", number_format($cfdi_impuesto->tasa, 2, ".", ""));
                 $traslado->agregarAtributo("importe", number_format($cfdi_impuesto->importe, 4, ".", ""));
                 $traslado->agregarAtributo("impuesto", $cfdi_impuesto->impuesto);
                 $traslados->agregarNodo($traslado);
             } else {
                 $total_retenidos += $cfdi_impuesto->importe;
                 $retenido = new CfdiNodo("cfdi:Retencion");
                 $retenido->agregarAtributo("impuesto", $cfdi_impuesto->impuesto);
                 $retenido->agregarAtributo("importe", number_format($cfdi_impuesto->importe, 4, ".", ""));
                 $retenidos->agregarNodo($retenido);
             }
         }
     }
     //Impuestos
     if ($total_retenidos > 0) {
         $impuestos->agregarNodo($retenidos);
         $impuestos->agregarAtributo("totalImpuestosRetenidos", number_format($total_retenidos, 4, ".", ""));
     }
     if ($total_trasladados > 0) {
         $impuestos->agregarNodo($traslados);
         $impuestos->agregarAtributo("totalImpuestosTrasladados", number_format($total_trasladados, 4, ".", ""));
     }
     $comprobante->agregarNodo($impuestos);
     $this->cfdi = $comprobante;
 }