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