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; }