Holo expertos de la web, veran en este momento tengo la necesidad de registrar una factura de venta y como sabran para esto hay que actualizar inventario, registrar venta, etc, este es el codigo PHP que tengo:
Código PHP:
Ver original//Funcion que registra una VENTA y luego envia al PDF que tiene el formato de la FACTURA
public function registrarVenta()
{
//Estado de la factura cancelada o pendiente
$_POST['fpago'] == 0 ? $estado = 0 : $estado = 1;
$estado == 0 ? $formaPago = 'Credito' : $formaPago = 'Contado';
//Consulto tipo de regimen de la empresa para calcular IVA
$consultaEmpresa = $this->db->query("SELECT tipoempr FROM tb_empresa WHERE codiempr = 1");
$tipoEmpresa = $consultaEmpresa->fetchColumn();
//Consulto codigo de la factura
$consultaFactura = $this->db->query("SELECT MAX(codivent) FROM tb_ventas");
$codigoVenta = $consultaFactura->fetchColumn() + 1;
//Consulto cantidad de productos para facturar
$consultaTemporales = $this->db->query("SELECT * FROM tb_temporales_vendidos");
foreach($consultaTemporales as $temporal):
//Comprubo que las variables no esten vacios de ser asi inserto en la tabla tb_det_ventas
$registrarDetalle = $this->db->prepare("INSERT INTO tb_det_ventas (codivent, codiprod, cantprod, valoprod) VALUES (?,?,?,?)");
$registrarDetalle->execute(array($codigoVenta, $temporal['codiprod'], $temporal['cantprod'], $temporal['valoprod']));
$consultaCantidadProductos = $this->db->prepare("SELECT cantprod FROM tb_productos WHERE cobaprod = ?");
$consultaCantidadProductos->execute(array($temporal['codiprod'])); $cantidadActual = $consultaCantidadProductos->fetchColumn();
//Actualizo la cantidad de producto del inventario
$nuevaCantidadProductos = $this->db->prepare("UPDATE tb_productos SET cantprod = ? WHERE cobaprod = ?");
$nuevaCantidadProductos->execute(array(($cantidadActual - $temporal['cantprod']), $temporal['codiprod']));
$subtotal += ($temporal['cantprod'] * $temporal['valoprod']);
endforeach;//Finaliza for
$_POST['descuento_fijo'] == '' ? $descuento = (($_POST['descuento_porcentaje']/100) * $subtotal) : $descuento = $_POST['descuento_fijo'];
//Calculo total parcial que es el resultado del subtotal - el descuento
$totalParcial = ($subtotal - $descuento);
//Calculo el IVA del total bruto que es el 16%
$tipoEmpresa == 1 ? $iva = ($totalParcial * (16/100)) : $iva = 0;
//Calculo TOTAL FINAL
$totalFinal = ($totalParcial + $iva);
//Calculo pendiente
$estado == 0 ? $pendiente = $totalFinal : $pendiente = 0;
//Inserto en la tabla el registro de facturas
$registrarVenta = $this->db->prepare("INSERT INTO tb_ventas (codiclie, codivend, subtvent, ivavent, descvent, totavent, saldvent, fopavent, estavent, fechvent, vencvent) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
$registrarVenta->bindParam(1, $_POST['cliente'], PDO::PARAM_INT);
$registrarVenta->bindParam(2, $_POST['vendedor'], PDO::PARAM_INT);
$registrarVenta->bindParam(3, ceil($subtotal), PDO
::PARAM_INT); $registrarVenta->bindParam(4, ceil($iva), PDO
::PARAM_INT); $registrarVenta->bindParam(5, ceil($descuento), PDO
::PARAM_INT); $registrarVenta->bindParam(6, ceil($totalFinal), PDO
::PARAM_INT); $registrarVenta->bindParam(7, ceil($pendiente), PDO
::PARAM_INT); $registrarVenta->bindParam(8, $estado, PDO::PARAM_INT);
$registrarVenta->bindParam(9, $estado, PDO::PARAM_INT);
$registrarVenta->bindParam(10, date("Y-m-d", time()), PDO
::PARAM_STR); $registrarVenta->bindParam(11, $_POST['vencimiento'], PDO::PARAM_STR);
$registrarVenta->execute();
Me ha pasado en algun momento que al llegar al paso de registrar la venta (despues de haber actualizado el inventario) me vota error...
Lo que quiero es que si todo sale bien que se haga todo el trabajo con la BD de lo contrario que deje todo como estaba, he leido sobre transaccion con PDO pero no termino de entender como adaptarlo a mi necesidad, espero puedan orientarme donde debo iniciar la transaccion y donde evaluar si todo salio correcto para hacer el commit() o el rollback()
Espero me puedan ayudar, gracias.