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