예제 #1
0
 /**
  * Recibe un objeto AlbaranCab o PstoCab y devuelve un array
  * con siete elementos:
  *
  *  [Promocion] -> El objeto promocion (si hay)
  *  [Promo][Precio] -> El precio de la promocion
  *  [Promo][Descuento] -> El descuento de la promocion
  *  [Promo][PrecioConImpuestos] -> El precio de la promocion con Impuestos
  *  [Tarifa][Precio] -> El precio de la tarifa
  *  [Tarifa][Descuento] -> El descuento de la tarifa
  *  [Tarifa][PrecioConImpuestos] -> El de la tarifa con impuestos
  *
  * Para ello consulta promociones vigentes para el artículo, cliente
  * y si no hay, aplica la tarifa asociada al cliente.
  *
  * @param objeto $objetoVenta Un objeto albaran o presupuesto
  * @return array Array con el objeto promocion, el precio y el descuento de la tarifa y de la promocion
  */
 public function cotizar($objetoVenta, $unidades)
 {
     $precios = array();
     // ---------------------------------------------------------------------
     // Coger el precio de tarifa
     // ---------------------------------------------------------------------
     $tarifa = $objetoVenta->getIDCliente()->getIDTarifa();
     if ($tarifa->getTipo()->getIDTipo() == '0') {
         //Descuento sobre el PVP
         $precios['Tarifa']['Precio'] = $this->getPrecioVenta();
         $precios['Tarifa']['Descuento'] = $tarifa->getValor();
     } else {
         //Margen sobre el PVD
         $precios['Tarifa']['Precio'] = $this->getPrecioCosto() * (1 + $tarifa->getValor() / 100);
         $precios['Tarifa']['Descuento'] = 0;
     }
     $precios['Tarifa']['PrecioConImpuestos'] = $precios['Tarifa']['Precio'] * (1 + $this->getIDIva()->getIva() / 100);
     // -------------------------------------------------------------------------
     //  Buscar promociones. En caso de haber promo para artículo y para familia,
     //  prevalecen los promos a nivel de artículo sobre
     //  las promos a nivel de familia
     // -------------------------------------------------------------------------
     $promocion = new Promociones();
     $filtro = "( \n                (IDArticulo='{$this->getIDArticulo()}') or \n                (IDFamilia='{$this->getIDFamilia()->getIDFamilia()}')\n            ) AND (CantidadMinima<='{$unidades}')\n              AND (FinPromocion>='{$objetoVenta->getDate()}') \n              AND (IDFP='{$objetoVenta->getIDFP()->getIDFP()}')";
     $promociones = $promocion->cargaCondicion("*", $filtro, "IDArticulo DESC");
     if (!count($promociones)) {
         $filtro = "( \n                (IDArticulo='{$this->getIDArticulo()}') or \n                (IDFamilia='{$this->getIDFamilia()->getIDFamilia()}')\n            ) AND (CantidadMinima<='{$unidades}')\n              AND (FinPromocion>='{$objetoVenta->getDate()}') \n              AND (IDFP='0')";
         $promociones = $promocion->cargaCondicion("*", $filtro, "IDArticulo DESC");
     }
     $hayPromo = false;
     if (count($promociones)) {
         // Recorro las promos-clientes a ver si hay alguna especifica para el cliente
         while (!$hayPromo and list(, $promocion) = each($promociones)) {
             // El articulo está en promocion, ver si aplica al cliente
             $promoCliente = new PromocionesClientes();
             $filtro = "IDPromocion='{$promocion['IDPromocion']}' and (IDCliente='{$objetoVenta->getIDCliente()->getIDCliente()}')";
             $promoClientes = $promoCliente->cargaCondicion("Id,IdPromocion", $filtro);
             if ($promoClientes[0]['Id'] != '') {
                 // La promo aplica
                 $hayPromo = true;
                 $promocion = new Promociones($promoClientes[0]['IdPromocion']);
             }
         }
         if (!$hayPromo) {
             // Recorro los promos-clientes a ver si hay alguna para el grupo de clientes
             reset($promociones);
             while (!$hayPromo and list(, $promocion) = each($promociones)) {
                 $promoCliente = new PromocionesClientes();
                 $filtro = "IDPromocion='{$promocion['IDPromocion']}' and (IDGrupo='{$objetoVenta->getIDCliente()->getIDGrupo()->getIDGrupo()}')";
                 $promoClientes = $promoCliente->cargaCondicion("Id,IdPromocion", $filtro);
                 if ($promoClientes[0]['Id'] != '') {
                     // La promo aplica
                     $hayPromo = true;
                     $promocion = new Promociones($promoClientes[0]['IdPromocion']);
                 }
             }
             unset($promoCliente);
         }
     }
     if ($hayPromo) {
         // Hay promo, coger precios de promo
         $precios['Promocion'] = $promocion;
         switch ($promocion->getTipoPromocion()->getIDTipo()) {
             case '0':
                 //Promocion de descuento en PVP
                 $precios['Promo']['Precio'] = $this->getPrecioVenta();
                 $precios['Promo']['Descuento'] = $promocion->getValor();
                 break;
             case '1':
                 //Promocion en Margen sobre PVD
                 $precios['Promo']['Precio'] = $this->getPrecioCosto() * (1 + $promocion->getValor() / 100);
                 $precios['Promo']['Descuento'] = 0;
                 break;
             case '2':
                 //Promocion en precio neto
                 $precios['Promo']['Precio'] = $promocion->getValor();
                 $precios['Promo']['Descuento'] = 0;
                 break;
         }
         $precios['Promo']['PrecioConImpuestos'] = $precios['Promo']['Precio'] * (1 + $this->getIDIva()->getIva() / 100);
     }
     unset($promocion);
     return $precios;
 }