示例#1
0
 public function actualizarFracciones($cantidad)
 {
     $cantDiff = $cantidad - $this->fracciones;
     //igual
     if ($cantDiff == 0) {
         echo CJSON::encode(array('result' => 'error', 'response' => 'Actualización exitosa.'));
         Yii::app()->end();
     }
     //aumentar
     if ($cantDiff > 0) {
         $objProducto = Producto::model()->find(array('with' => array('listSaldos' => array('condition' => '(listSaldos.saldoFraccion>:saldo AND listSaldos.codigoCiudad=:ciudad AND listSaldos.codigoSector=:sector) OR (listSaldos.saldoFraccion IS NULL AND listSaldos.codigoCiudad IS NULL AND listSaldos.codigoSector IS NULL)'), 'listPrecios' => array('condition' => '(listPrecios.codigoCiudad=:ciudad AND listPrecios.codigoSector=:sector) OR (listPrecios.codigoCiudad IS NULL AND listPrecios.codigoSector IS NULL)'), 'listSaldosTerceros' => array('condition' => '(listSaldosTerceros.codigoCiudad=:ciudad AND listSaldosTerceros.codigoSector=:sector) OR (listSaldosTerceros.codigoCiudad IS NULL AND listSaldosTerceros.codigoSector IS NULL)')), 'condition' => 't.activo=:activo AND t.codigoProducto=:codigo AND ( (listSaldos.saldoUnidad IS NOT NULL AND listPrecios.codigoCiudad IS NOT NULL) OR listSaldosTerceros.codigoCiudad IS NOT NULL)', 'params' => array(':activo' => 1, ':codigo' => $this->codigoProducto, ':saldo' => 0, ':ciudad' => $this->objCompra->codigoCiudad, ':sector' => $this->objCompra->codigoSector)));
         if ($objProducto === null) {
             throw new Exception('Producto no disponible.');
         }
         $objSaldo = $objProducto->getSaldo($this->objCompra->codigoCiudad, $this->objCompra->codigoSector);
         if ($objSaldo === null) {
             throw new Exception("La cantidad solicitada no está disponible en este momento. No hay unidades disponibles");
         }
         if ($cantDiff > $objSaldo->saldoFraccion) {
             throw new Exception("La cantidad solicitada no está disponible en este momento. Saldos disponibles: {$objSaldo->saldoFraccion} fracciones");
         }
     }
     $precioTotal = $this->precioBaseFraccion - $this->descuentoFraccion;
     $precioDiff = $precioTotal * $cantDiff;
     $this->fracciones += $cantDiff;
     $this->precioTotalFraccion += $precioDiff;
     $this->idEstadoItem = Yii::app()->params->callcenter['estadoItem']['estado']['modificado'];
     $this->idOperador = Yii::app()->controller->module->user->id;
     $objCompra = $this->objCompra;
     $objCompra->subtotalCompra += $precioDiff;
     $objCompra->impuestosCompra += round(Precio::calcularImpuesto($precioDiff, $this->objImpuesto->porcentaje));
     $objCompra->baseImpuestosCompra += round(Precio::calcularBaseImpuesto($precioDiff, $this->objImpuesto->porcentaje));
     $objCompra->totalCompra += $precioDiff;
     if ($this->unidades + $this->fracciones == 0) {
         $objCompra->flete -= $this->flete;
     }
     $transaction = Yii::app()->db->beginTransaction();
     if (!$this->save()) {
         try {
             $transaction->rollBack();
         } catch (Exception $txexc) {
             Yii::log($txexc->getMessage() . "\n" . $txexc->getTraceAsString(), CLogger::LEVEL_ERROR, 'application');
         }
         throw new Exception('Error de actualización item: ' . $this->validateErrorsResponse());
     }
     if ($objCompra->totalCompra < 0) {
         try {
             $transaction->rollBack();
         } catch (Exception $txexc) {
             Yii::log($txexc->getMessage() . "\n" . $txexc->getTraceAsString(), CLogger::LEVEL_ERROR, 'application');
         }
         throw new Exception('Total compra no puede ser negativo');
     }
     if (!$objCompra->save()) {
         try {
             $transaction->rollBack();
         } catch (Exception $txexc) {
             Yii::log($txexc->getMessage() . "\n" . $txexc->getTraceAsString(), CLogger::LEVEL_ERROR, 'application');
         }
         throw new Exception('Error de actualización compra: ' . $objCompra->validateErrorsResponse());
     }
     $transaction->commit();
 }
 public function getBaseTaxPrice($total = false)
 {
     $base = 0.0;
     if ($total) {
         $base = Precio::calcularBaseImpuesto($this->getPrice(true) * $this->quantityFraction, $this->tax) + Precio::calcularBaseImpuesto($this->getPrice() * ($this->quantityUnit + $this->quantityStored), $this->tax);
     } else {
         $base = Precio::calcularBaseImpuesto($this->getPrice(), $this->tax);
     }
     return round($base);
 }