private function procesoCompra(FormaPagoForm $modelPago, $tipoEntrega) { $categoriasCompra = array(); $productosCompra = array(); $transaction = Yii::app()->db->beginTransaction(); try { //registrar compra compra $objCompra = new Compras(); $objCompra->identificacionUsuario = $modelPago->identificacionUsuario; $objCompra->tipoEntrega = $tipoEntrega; //if($tipoEntrega==Yii::app()->params->entrega['tipo']['domicilio']){ $objCompra->fechaEntrega = $modelPago->fechaEntrega; $objCompra->observacion = $modelPago->comentario; //} if ($tipoEntrega == Yii::app()->params->entrega['tipo']['presencial']) { $puntoVenta = $modelPago->listPuntosVenta[1][$modelPago->indicePuntoVenta]; $objCompra->idComercial = $puntoVenta[1]; } if ($modelPago->idFormaPago == Yii::app()->params->formaPago['pasarela']['idPasarela']) { $objCompra->idEstadoCompra = Yii::app()->params->callcenter['estadoCompra']['estado']['pendientePasarela']; } else { $objCompra->idEstadoCompra = Yii::app()->params->callcenter['estadoCompra']['estado']['pendiente']; } $objCompra->idTipoVenta = 1; $objCompra->activa = 1; $objCompra->invitado = $modelPago->pagoInvitado ? 1 : 0; $objCompra->codigoPerfil = Yii::app()->shoppingCart->getCodigoPerfil(); $objCompra->codigoCiudad = Yii::app()->shoppingCart->getCodigoCiudad(); $objCompra->codigoSector = Yii::app()->shoppingCart->getCodigoSector(); if ($tipoEntrega == Yii::app()->params->entrega['tipo']['domicilio']) { $objCompra->tiempoDomicilioCedi = Yii::app()->shoppingCart->getDeliveryStored(); $objCompra->valorDomicilioCedi = Yii::app()->shoppingCart->getShippingStored(); $objCompra->codigoCedi = Yii::app()->shoppingCart->objSectorCiudad->objCiudad->codigoSucursal; } else { if ($tipoEntrega == Yii::app()->params->entrega['tipo']['presencial']) { $objCompra->tiempoDomicilioCedi = 0; $objCompra->valorDomicilioCedi = 0; $objCompra->codigoCedi = 0; } } $objCompra->subtotalCompra = Yii::app()->shoppingCart->getCost(); $objCompra->impuestosCompra = Yii::app()->shoppingCart->getTaxPrice(); $objCompra->baseImpuestosCompra = Yii::app()->shoppingCart->getBaseTaxPrice(); $objCompra->domicilio = Yii::app()->shoppingCart->getShipping(); $objCompra->flete = Yii::app()->shoppingCart->getExtraShipping(); $objCompra->totalCompra = Yii::app()->shoppingCart->getTotalCost(); if (!$objCompra->save()) { throw new Exception("Error al guardar compra" . $objCompra->validateErrorsResponse()); } if ($tipoEntrega == Yii::app()->params->entrega['tipo']['presencial']) { $puntoVenta = $modelPago->listPuntosVenta[1][$modelPago->indicePuntoVenta]; $objEstadoCompra = new ComprasEstados(); $objEstadoCompra->idCompra = $objCompra->idCompra; $objEstadoCompra->idEstadoCompra = Yii::app()->params->callcenter['estadoCompra']['estado']['asignado']; $objEstadoCompra->idOperador = 38; if (!$objEstadoCompra->save()) { throw new Exception("Error al guardar traza de estado: " . $objEstadoCompra->validateErrorsResponse()); } $objObservacion = new ComprasObservaciones(); $objObservacion->idCompra = $objCompra->idCompra; $objObservacion->observacion = "Cambio de Estado: Asignado PDV. " . $puntoVenta[2]; $objObservacion->idOperador = 38; $objObservacion->notificarCliente = 0; if (!$objObservacion->save()) { throw new Exception("Error al guardar observación" . $objObservacion->validateErrorsResponse()); } $objEstadoCompra2 = new ComprasEstados(); $objEstadoCompra2->idCompra = $objCompra->idCompra; $objEstadoCompra2->idEstadoCompra = Yii::app()->params->callcenter['estadoCompra']['estado']['pendiente']; $objEstadoCompra2->idOperador = 38; if (!$objEstadoCompra2->save()) { throw new Exception("Error al guardar traza de estado: " . $objEstadoCompra2->validateErrorsResponse()); } $objObservacion2 = new ComprasObservaciones(); $objObservacion2->idCompra = $objCompra->idCompra; $objObservacion2->observacion = "Cambio de Estado: Pendiente de entrega a cliente en PDV. " . $puntoVenta[2]; $objObservacion2->idOperador = 38; $objObservacion2->notificarCliente = 0; if (!$objObservacion2->save()) { throw new Exception("Error al guardar observación" . $objObservacion2->validateErrorsResponse()); } } if ($modelPago->bono !== null && $modelPago->usoBono == 1) { Yii::app()->shoppingCart->setBono($modelPago->bono['valor']); } $objFormasPago = new FormasPago(); //FormaPago::model()->findByPk($modelPago->idFormaPago); $objFormasPago->idCompra = $objCompra->idCompra; $objFormasPago->valor = Yii::app()->shoppingCart->getTotalCost(); $objFormasPago->numeroTarjeta = $modelPago->numeroTarjeta; $objFormasPago->cuotasTarjeta = $modelPago->cuotasTarjeta; $objFormasPago->idFormaPago = $modelPago->idFormaPago; $objFormasPago->valorBono = Yii::app()->shoppingCart->getBono(); /* if ($modelPago->bono !== null && $modelPago->usoBono == 1) { $objFormasPago->valorBono = $modelPago->bono['valor']; } */ /*if($objFormasPago->valorBono>0){ try{ $clientBono = new SoapClient(null, array( 'location' => Yii::app()->params->webServiceUrl['crmLrv'], 'uri' => "", 'trace' => 1 )); $resultBono = $clientBono->__soapCall("ActualizarBono", array('identificacion' => $objCompra->identificacionUsuario)); if (empty($resultBono) || $resultBono[0]->ESTADO == 0) { throw new Exception("Error al actualizar bono"); } }catch(SoapFault $soapExc){ throw new Exception("Error al actualizar bono"); } }*/ if (!$objFormasPago->save()) { throw new Exception("Error al guardar forma de pago" . $objFormasPago->validateErrorsResponse()); } $objCompraDireccion = new ComprasDireccionesDespacho(); if ($tipoEntrega == Yii::app()->params->entrega['tipo']['domicilio']) { if ($modelPago->pagoInvitado) { $objCompraDireccion->idCompra = $objCompra->idCompra; $objCompraDireccion->descripcion = $modelPago->descripcion; $objCompraDireccion->nombre = $modelPago->nombre; $objCompraDireccion->direccion = $modelPago->direccion; $objCompraDireccion->barrio = $modelPago->barrio; $objCompraDireccion->telefono = $modelPago->telefono; $objCompraDireccion->celular = $modelPago->celular; $objCompraDireccion->codigoCiudad = Yii::app()->shoppingCart->getCodigoCiudad(); $objCompraDireccion->codigoSector = Yii::app()->shoppingCart->getCodigoSector(); } else { $objDireccion = DireccionesDespacho::model()->findByPk($modelPago->idDireccionDespacho); $objCompraDireccion->idCompra = $objCompra->idCompra; $objCompraDireccion->descripcion = $objDireccion->descripcion; $objCompraDireccion->nombre = $objDireccion->nombre; $objCompraDireccion->direccion = $objDireccion->direccion; $objCompraDireccion->barrio = $objDireccion->barrio; $objCompraDireccion->telefono = $objDireccion->telefono; $objCompraDireccion->celular = $objDireccion->celular; $objCompraDireccion->codigoCiudad = $objDireccion->codigoCiudad; $objCompraDireccion->codigoSector = $objDireccion->codigoSector; $objCompraDireccion->pdvAsignado = $objDireccion->pdvAsignado; if ($objDireccion->codigoSector == 0 && Yii::app()->shoppingCart->getCodigoSector() != 0) { $objDireccion->codigoSector = Yii::app()->shoppingCart->getCodigoSector(); $objDireccion->save(); } } } else { if ($tipoEntrega == Yii::app()->params->entrega['tipo']['presencial']) { $objCompraDireccion = new ComprasDireccionesDespacho(); $objCompraDireccion->idCompra = $objCompra->idCompra; $objCompraDireccion->descripcion = "NA"; $objCompraDireccion->nombre = "NA"; $objCompraDireccion->direccion = "NA"; $objCompraDireccion->barrio = "NA"; $objCompraDireccion->telefono = $modelPago->telefonoContacto; } } if (!$objCompraDireccion->save()) { throw new Exception("Error al guardar dirección de compra" . $objCompraDireccion->validateErrorsResponse()); } //generar puntos //-- $listPuntosCompra = array(); if (!$modelPago->pagoInvitado) { $fecha = new DateTime(); $parametrosPuntos = array(Yii::app()->params->puntos['categoria'] => Yii::app()->shoppingCart->getCategorias(), Yii::app()->params->puntos['marca'] => Yii::app()->shoppingCart->getMarcas(), Yii::app()->params->puntos['proveedor'] => Yii::app()->shoppingCart->getProveedores(), Yii::app()->params->puntos['producto'] => Yii::app()->shoppingCart->getProductosCantidad(), Yii::app()->params->puntos['monto'] => $objCompra->subtotalCompra, Yii::app()->params->puntos['cedula'] => array('identificacionUsuario' => Yii::app()->user->name, 'valor' => $objCompra->subtotalCompra), Yii::app()->params->puntos['rango'] => array('fecha' => $fecha, 'valor' => $objCompra->subtotalCompra), Yii::app()->params->puntos['cumpleanhos'] => array('fechaNacimiento' => Yii::app()->session[Yii::app()->params->usuario['sesion']]->objUsuarioExtendida->fechaNacimiento, 'valor' => $objCompra->subtotalCompra), Yii::app()->params->puntos['clientefielCompra'] => $objCompra->subtotalCompra); $listPuntosCompra = ComprasPuntos::generarPuntos($fecha, Yii::app()->session[Yii::app()->params->usuario['sesion']], $parametrosPuntos); } //-- generar puntos // guardar puntos //-- foreach ($listPuntosCompra as $objPuntoCompra) { $objPuntoCompra->idCompra = $objCompra->idCompra; if (!$objPuntoCompra->save()) { throw new Exception("Error al guardar punto de compra {$objPuntoCompra->idPunto}. " . $objPuntoCompra->validateErrorsResponse()); } } //-- guardar puntos //-- //items de compra $positions = Yii::app()->shoppingCart->getPositions(); foreach ($positions as $position) { if ($position->isProduct()) { //actualizar saldo producto //-- $objSaldo = null; if ($position->objProducto->tercero == 1) { $objSaldo = ProductosSaldosTerceros::model()->find(array('condition' => 'codigoCiudad=:ciudad AND codigoSector=:sector AND codigoProducto=:producto', 'params' => array(':ciudad' => Yii::app()->shoppingCart->getCodigoCiudad(), ':sector' => Yii::app()->shoppingCart->getCodigoSector(), ':producto' => $position->objProducto->codigoProducto))); } else { $objSaldo = ProductosSaldos::model()->find(array('condition' => 'codigoCiudad=:ciudad AND codigoSector=:sector AND codigoProducto=:producto', 'params' => array(':ciudad' => Yii::app()->shoppingCart->getCodigoCiudad(), ':sector' => Yii::app()->shoppingCart->getCodigoSector(), ':producto' => $position->objProducto->codigoProducto))); } if ($objSaldo == null) { throw new Exception("Producto " . $position->objProducto->codigoProducto . " no disponible"); } if ($objSaldo->saldoUnidad < $position->getQuantityUnit()) { throw new Exception("Producto " . $position->objProducto->codigoProducto . ". La cantidad solicitada no está disponible en este momento. Saldos disponibles: {$objSaldo->saldoUnidad} unidades"); } if ($objSaldo->saldoFraccion < $position->getQuantity(true)) { throw new Exception("Producto " . $position->objProducto->codigoProducto . ". La cantidad solicitada no está disponible en este momento. Saldos disponibles: {$objSaldo->saldoFraccion} fracciones"); } $objSaldo->saldoUnidad = $objSaldo->saldoUnidad - $position->getQuantityUnit(); $objSaldo->saldoFraccion = $objSaldo->saldoFraccion - $position->getQuantity(true); $objSaldo->save(); //-- actualizar saldo producto //actualizar saldo bodega //-- if ($position->getQuantityStored() > 0) { $objSaldoBodega = ProductosSaldosCedi::model()->find(array('condition' => 'codigoCedi=:cedi AND codigoProducto=:producto', 'params' => array(':cedi' => Yii::app()->shoppingCart->getObjCiudad()->codigoSucursal, ':producto' => $position->objProducto->codigoProducto))); if ($objSaldoBodega == null) { throw new Exception("Producto " . $position->objProducto->codigoProducto . " no disponible en bodega"); } if ($objSaldoBodega->saldoUnidad < $position->getQuantityStored()) { throw new Exception("Producto " . $position->objProducto->codigoProducto . ". La cantidad solicitada no está disponible en este momento. Saldos disponibles: {$objSaldoBodega->saldoUnidad} unidades"); } $objSaldoBodega->saldoUnidad = $objSaldoBodega->saldoUnidad - $position->getQuantityStored(); $objSaldoBodega->save(); } //-- actualizar saldo bodega $objItem = new ComprasItems(); $objItem->idCompra = $objCompra->idCompra; $objItem->codigoProducto = $position->objProducto->codigoProducto; $objItem->descripcion = $position->objProducto->descripcionProducto; $objItem->presentacion = $position->objProducto->presentacionProducto; $objItem->precioBaseUnidad = $position->getPrice(false, false); $objItem->precioBaseFraccion = $position->getPrice(true, false); $objItem->descuentoUnidad = $position->getDiscountPrice(); $objItem->descuentoFraccion = $position->getDiscountPrice(true); $objItem->precioTotalUnidad = $position->getSumPriceUnit(); $objItem->precioTotalFraccion = $position->getSumPriceFraction(true); $objItem->terceros = $position->objProducto->tercero; $objItem->unidades = $position->getQuantityUnit(); $objItem->fracciones = $position->getQuantity(true); $objItem->unidadesCedi = $position->getQuantityStored(); $objItem->codigoImpuesto = $position->objProducto->codigoImpuesto; $objItem->idEstadoItem = Yii::app()->params->callcenter['estadoItem']['estado']['activo']; //$objItem->idEstadoItemTercero = null; $objItem->flete = $position->getShipping(); $objItem->disponible = 1; if ($objCompra->identificacionUsuario !== null) { $categoriasCompra[] = "('" . $objCompra->identificacionUsuario . "','" . $position->objProducto->idCategoriaBI . "')"; } $productosCompra[] = "('" . $position->objProducto->codigoProducto . "')"; if (!$objItem->save()) { throw new Exception("Error al guardar item de compra {$objItem->codigoProducto}. " . $objItem->validateErrorsResponse()); } //beneficios foreach ($position->getBeneficios() as $objBeneficio) { $objBeneficioItem = new BeneficiosComprasItems(); $objBeneficioItem->idBeneficio = $objBeneficio->idBeneficio; $objBeneficioItem->idBeneficioSincronizado = $objBeneficio->idBeneficioSincronizado; $objBeneficioItem->idCompraItem = $objItem->idCompraItem; $objBeneficioItem->tipo = $objBeneficio->tipo; $objBeneficioItem->fechaIni = $objBeneficio->fechaIni; $objBeneficioItem->fechaFin = $objBeneficio->fechaFin; $objBeneficioItem->dsctoUnid = $objBeneficio->dsctoUnid; $objBeneficioItem->dsctoFrac = $objBeneficio->dsctoFrac; $objBeneficioItem->vtaUnid = $objBeneficio->vtaUnid; $objBeneficioItem->vtaFrac = $objBeneficio->vtaFrac; $objBeneficioItem->pagoUnid = $objBeneficio->pagoUnid; $objBeneficioItem->pagoFrac = $objBeneficio->pagoFrac; $objBeneficioItem->cuentaCop = $objBeneficio->cuentaCop; $objBeneficioItem->nitCop = $objBeneficio->nitCop; $objBeneficioItem->porcCop = $objBeneficio->porcCop; $objBeneficioItem->cuentaProv = $objBeneficio->cuentaProv; $objBeneficioItem->nitProv = $objBeneficio->nitProv; $objBeneficioItem->porcProv = $objBeneficio->porcProv; $objBeneficioItem->promoFiel = $objBeneficio->promoFiel; $objBeneficioItem->mensaje = $objBeneficio->mensaje; $objBeneficioItem->swobligaCli = $objBeneficio->swobligaCli; $objBeneficioItem->fechaCreacionBeneficio = $objBeneficio->fechaCreacionBeneficio; if (!$objBeneficioItem->save()) { throw new Exception("Error al guardar beneficio de compra {$objBeneficioItem->idCompraItem}. " . $objBeneficioItem->validateErrorsResponse()); } } } else { if ($position->isCombo()) { $objSaldo = ComboSectorCiudad::model()->find(array('condition' => 'codigoCiudad=:ciudad AND codigoSector=:sector AND idCombo=:combo', 'params' => array(':ciudad' => Yii::app()->shoppingCart->getCodigoCiudad(), ':sector' => Yii::app()->shoppingCart->getCodigoSector(), ':combo' => $position->objCombo->idCombo))); if ($objSaldo == null) { throw new Exception("Combo " . $position->objCombo->getCodigo() . " no disponible"); } if ($objSaldo->saldo < $position->getQuantity()) { throw new Exception("Combo " . $position->objCombo->getCodigo() . "La cantidad solicitada no está disponible en este momento. Saldos disponibles: {$objSaldo->saldo} unidades"); } $objSaldo->saldo = $objSaldo->saldo - $position->getQuantity(); $objSaldo->save(); foreach ($position->objCombo->listProductosCombo as $productoCombo) { $objItem = new ComprasItems(); $objItem->idCompra = $objCompra->idCompra; $objItem->idCombo = $position->objCombo->idCombo; $objItem->codigoProducto = $productoCombo->objProducto->codigoProducto; $objItem->descripcion = $productoCombo->objProducto->descripcionProducto; $objItem->descripcionCombo = $position->objCombo->descripcionCombo; $objItem->presentacion = $productoCombo->objProducto->presentacionProducto; $objItem->precioBaseUnidad = $productoCombo->precio; $objItem->precioBaseFraccion = 0; $objItem->descuentoUnidad = 0; $objItem->descuentoFraccion = 0; $objItem->precioTotalUnidad = $productoCombo->precio * $position->getQuantity(); $objItem->precioTotalFraccion = 0; $objItem->terceros = $productoCombo->objProducto->tercero; $objItem->unidades = $position->getQuantity(); $objItem->fracciones = 0; $objItem->unidadesCedi = 0; $objItem->codigoImpuesto = $productoCombo->objProducto->codigoImpuesto; $objItem->idEstadoItem = Yii::app()->params->callcenter['estadoItem']['estado']['activo']; //$objItem->idEstadoItemTercero = null; $objItem->flete = $position->getShipping(); $objItem->disponible = 1; if (!$objItem->save()) { throw new Exception("Error al guardar item de compra {$objItem->codigoProducto}. " . $objItem->validateErrorsResponse()); } if ($objCompra->identificacionUsuario !== null) { $categoriasCompra[] = "('" . $objCompra->identificacionUsuario . "','" . $productoCombo->objProducto->idCategoriaBI . "')"; } $productosCompra[] = "('" . $productoCombo->objProducto->codigoProducto . "')"; } } } } $objUsuario = Yii::app()->session[Yii::app()->params->usuario['sesion']]; $objPasarelaEnvio = null; $asuntoCorreo = Yii::app()->params->asunto['pedidoRealizado']; if ($modelPago->idFormaPago == Yii::app()->params->formaPago['pasarela']['idPasarela']) { $asuntoCorreo = Yii::app()->params->asunto['pedidoRealizadoPasarela']; $objPasarelaEnvio = new PasarelaEnvios(); $objPasarelaEnvio->idCompra = $objCompra->idCompra; $objPasarelaEnvio->valor = $objCompra->totalCompra; $objPasarelaEnvio->iva = $objCompra->impuestosCompra; $objPasarelaEnvio->baseIva = $objCompra->baseImpuestosCompra; $objPasarelaEnvio->moneda = "COP"; $objPasarelaEnvio->nombre = $objUsuario->getNombreCompleto(); $objPasarelaEnvio->identificacionUsuario = $objCompra->identificacionUsuario; $objPasarelaEnvio->tipoDocumento = 1; $objPasarelaEnvio->correoElectronico = $objUsuario->correoElectronico; if (!$objPasarelaEnvio->save()) { throw new Exception("Error al guardar registro de pasarela. " . $objPasarelaEnvio->validateErrorsResponse()); } } if (count($categoriasCompra) > 0) { $sql = "INSERT INTO t_ComprasUsuariosCategorias(identificacionUsuario, idCategoriaBI) VALUES " . implode(",", $categoriasCompra) . " ON DUPLICATE KEY UPDATE cantidad=cantidad+1"; Yii::app()->db->createCommand($sql)->execute(); } if (count($productosCompra) > 0) { $sql = "INSERT INTO t_ProductosVendidos(codigoProducto) VALUES " . implode(",", $productosCompra) . " ON DUPLICATE KEY UPDATE cantidad=cantidad+1"; Yii::app()->db->createCommand($sql)->execute(); } $objFormaPago = FormaPago::model()->findByPk($modelPago->idFormaPago); $contenidoCorreo = $this->renderPartial('compraCorreo', array('objCompra' => $objCompra, 'modelPago' => $modelPago, 'objCompraDireccion' => $objCompraDireccion, 'objFormaPago' => $objFormaPago, 'objFormasPago' => $objFormasPago, 'objUsuario' => $objUsuario), true, true); $htmlCorreo = $this->renderPartial('/usuario/_correo', array('contenido' => $contenidoCorreo), true, true); sendHtmlEmail($objUsuario->correoElectronico, $asuntoCorreo, $htmlCorreo); $transaction->commit(); return array('result' => 1, 'response' => array('objCompra' => $objCompra, 'modelPago' => $modelPago, 'objCompraDireccion' => $objCompraDireccion, 'objFormaPago' => $objFormaPago, 'objFormasPago' => $objFormasPago, 'objPasarelaEnvio' => $objPasarelaEnvio)); } catch (Exception $exc) { Yii::log($exc->getMessage() . "\n" . $exc->getTraceAsString(), CLogger::LEVEL_ERROR, 'application'); try { $transaction->rollBack(); } catch (Exception $txexc) { Yii::log($txexc->getMessage() . "\n" . $txexc->getTraceAsString(), CLogger::LEVEL_ERROR, 'application'); } return array('result' => 0, 'response' => $exc->getMessage()); } }
public function getPuntosCompra() { $puntos = ComprasPuntos::model()->find("idCompra=:idcompra", array("idcompra" => $this->idCompra)); if (!$puntos) { return 0; } else { return $puntos->cantidadPuntos; } }
public function actionPuntoscompra() { $fecha = new DateTime(); $parametrosPuntos = array(Yii::app()->params->puntos['categoria'] => Yii::app()->shoppingCart->getCategorias(), Yii::app()->params->puntos['marca'] => Yii::app()->shoppingCart->getMarcas(), Yii::app()->params->puntos['proveedor'] => Yii::app()->shoppingCart->getProveedores(), Yii::app()->params->puntos['producto'] => Yii::app()->shoppingCart->getProductosCantidad(), Yii::app()->params->puntos['clientefielCompra'] => Yii::app()->shoppingCart->getCost(), Yii::app()->params->puntos['monto'] => Yii::app()->shoppingCart->getCost(), Yii::app()->params->puntos['cedula'] => array('identificacionUsuario' => Yii::app()->user->name, 'valor' => Yii::app()->shoppingCart->getCost()), Yii::app()->params->puntos['rango'] => array('fecha' => $fecha, 'valor' => Yii::app()->shoppingCart->getCost()), Yii::app()->params->puntos['cumpleanhos'] => array('fechaNacimiento' => Yii::app()->session[Yii::app()->params->usuario['sesion']]->objUsuarioExtendida->fechaNacimiento, 'valor' => Yii::app()->shoppingCart->getCost())); //CVarDumper::dump($parametrosPuntos,3,true);exit(); $listPuntosCompra = ComprasPuntos::generarPuntos($fecha, Yii::app()->session[Yii::app()->params->usuario['sesion']], $parametrosPuntos); CVarDumper::dump($listPuntosCompra, 3, true); }