/**
  * Validacion lógica
  */
 protected function validaLogico()
 {
     parent::validaLogico();
     if ($this->IDGrupo != '') {
         $this->IDCliente = NULL;
     } else {
         $this->IDGrupo = NULL;
     }
     if (!$this->IDGrupo and !$this->IDCliente) {
         $this->_errores[] = 'Debe indicar un grupo de clientes o un cliente concreto';
     }
     // Comprobar que no existe duplicidad de IDPromocion-IDGrupo
     $promocion = new PromocionesClientes();
     $promos = $promocion->cargaCondicion("Id", "IDPromocion='{$this->IDPromocion}' and IDGrupo='{$this->IDGrupo}'");
     if (count($promos)) {
         $this->_errores[] = 'Ya existe este grupo en la promoción';
     }
     unset($promocion);
 }
예제 #2
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;
 }
 /**
  * Crea un registro nuevo
  *
  * Si viene por GET muestra un template vacio
  * Si viene por POST crea un registro
  *
  * @return array con el template y valores a renderizar
  */
 public function newAction()
 {
     if ($this->values['permisos']['permisosModulo']['IN']) {
         switch ($this->request["METHOD"]) {
             case 'GET':
                 //MOSTRAR FORMULARIO VACIO
                 //SI EN LA POSICION 2 DEL REQUEST VIENE ALGO,
                 //SE ENTIENDE QUE ES EL VALOR DE LA CLAVE PARA LINKAR CON LA ENTIDAD PADRE
                 //ESTO SE UTILIZA PARA LOS FORMULARIOS PADRE->HIJO
                 if ($this->request['2'] != '') {
                     $this->values['linkBy']['value'] = $this->request['2'];
                 }
                 $datos = new $this->entity();
                 $this->values['datos'] = $datos;
                 $this->values['errores'] = array();
                 return array('template' => $this->entity . '/new.html.twig', 'values' => $this->values);
                 break;
             case 'POST':
                 //CREAR NUEVO REGISTRO
                 $idPromocion = $this->request[$this->entity][$this->values['linkBy']['id']];
                 //COGER EL LINK A LA ENTIDAD PADRE
                 if ($this->values['linkBy']['id'] != '') {
                     $this->values['linkBy']['value'] = $this->request[$this->entity][$this->values['linkBy']['id']];
                 }
                 $idGrupo = $this->request['PromocionesClientes']['IDGrupo'];
                 if ($idGrupo == -1) {
                     // Todos los grupos. Hay que crear la promocion para todos los grupos
                     $grupo = new ClientesGrupos();
                     $grupos = $grupo->cargaCondicion("IDGrupo", "1", "Grupo ASC");
                     foreach ($grupos as $value) {
                         $promo = new PromocionesClientes();
                         $promo->setIDPromocion($idPromocion);
                         $promo->setIDGrupo($value['IDGrupo']);
                         if ($promo->valida($this->form->getRules())) {
                             $promo->create();
                         }
                     }
                     unset($promo);
                     unset($grupo);
                     return $this->listAction($idPromocion);
                 } else {
                     $datos = new $this->entity();
                     $datos->bind($this->request[$this->entity]);
                     if ($datos->valida($this->form->getRules())) {
                         $datos->create();
                         $this->values['errores'] = $datos->getErrores();
                         $this->values['alertas'] = $datos->getAlertas();
                         //Recargo el objeto para refrescar las propiedas que
                         //hayan podido ser objeto de algun calculo durante el proceso
                         //de guardado.
                         $datos = new $this->entity($datos->getPrimaryKeyValue());
                         $this->values['datos'] = $datos;
                         if ($this->values['errores']) {
                             return array('template' => $this->entity . '/new.html.twig', 'values' => $this->values);
                         } else {
                             return array('template' => $this->entity . '/edit.html.twig', 'values' => $this->values);
                         }
                     } else {
                         $this->values['datos'] = $datos;
                         $this->values['errores'] = $datos->getErrores();
                         $this->values['alertas'] = $datos->getAlertas();
                         return array('template' => $this->entity . '/new.html.twig', 'values' => $this->values);
                     }
                 }
                 break;
         }
     } else {
         return array('template' => '_global/forbiden.html.twig');
     }
 }
예제 #4
0
 /**
  * Devuelve las promociones vigentes para el cliente
  * y la fecha indicada.
  *
  * El formato de fecha pasado debe ser YYYY-mm-dd
  *
  * @param date $fecha La fecha
  * @return array Array con objetos promociones
  */
 public function getPromosVigentes($fecha = '')
 {
     if ($fecha == '') {
         $fecha = date('Y-m-d');
     }
     $promos = array();
     $promociones = new Promociones();
     $promoClientes = new PromocionesClientes();
     $familias = new Familias();
     $em = new EntityManager($promociones->getConectionName());
     if ($em->getDbLink()) {
         $query = "SELECT DISTINCT t1.IDPromocion\n                FROM {$promociones->getDataBaseName()}.{$promociones->getTableName()} as t1,\n                     {$promoClientes->getDataBaseName()}.{$promoClientes->getTableName()} as t2,\n                     {$familias->getDataBaseName()}.{$familias->getTableName()} as t3\n                WHERE t1.FinPromocion>='{$fecha}'\n                AND t1.IDPromocion=t2.IDPromocion\n                AND ( (t2.IDCliente='{$this->IDCliente}') OR (t2.IDGrupo='{$this->getIDGrupo()->getIDGrupo()}') )\n                AND ( t1.IDFamilia = t3.IDFamilia OR (1))\n                ORDER BY t1.FinPromocion ASC, t1.IDArticulo DESC,t3.Familia";
         $em->query($query);
         $rows = $em->fetchResult();
         $em->desConecta();
         foreach ($rows as $row) {
             $promos[] = new Promociones($row['IDPromocion']);
         }
     }
     unset($em);
     unset($promociones);
     unset($promoClientes);
     unset($familias);
     return $promos;
 }