require_once "../../../server/bootstrap.php";
$page = new GerenciaComponentPage();
//
// Parametros necesarios
//
$page->requireParam("tid", "GET", "Este traspaso no existe.");
$este_traspaso = TraspasoDAO::getByPK($_GET["tid"]);
//
// Titulo de la pagina
//
$page->addComponent(new TitleComponent("Editar traspaso " . $este_traspaso->getIdTraspaso() . "\n                    . De almacen: " . AlmacenDAO::getByPK($este_traspaso->getIdAlmacenEnvia())->getNombre() . "\n                        al almacen: " . AlmacenDAO::getByPK($este_traspaso->getIdAlmacenRecibe())->getNombre(), 2));
//
// Forma de usuario
//
$form = new DAOFormComponent($este_traspaso);
$form->hideField(array("id_traspaso", "id_usuario_programa", "id_usuario_envia", "fecha_envio", "id_usuario_recibe", "fecha_recibo", "estado", "cancelado", "completo", "id_almacen_envia", "id_almacen_recibe"));
$form->addApiCall("api/sucursal/almacen/traspaso/editar/", "GET");
$form->addField("id_producto", "Productos", "text", "", "productos");
$form->createListBoxJoin("id_producto", "nombre_producto", ProductoDAO::search(new Producto(array("activo" => 1))));
$form->renameField(array("id_producto" => "productos"));
//$form->createComboBoxJoin( "id_ciudad", "nombre", CiudadDAO::getAll(), $esta_direccion->getIdCiudad() );
//                $form->createComboBoxJoin( "id_rol", "nombre", RolDAO::getAll(), $este_usuario->getIdRol() );
//
//                $form->createComboBoxJoin( "id_moneda", "nombre", MonedaDAO::search( new Moneda( array( "activa" => 1 ) ) ),$este_usuario->getIdMoneda() );
//
//                $form->createComboBoxJoin( "id_clasificacion_cliente", "nombre", ClasificacionClienteDAO::getAll(), $este_usuario->getIdClasificacionCliente() );
//
//                $form->createComboBoxJoin( "id_clasificacion_proveedor", "nombre", ClasificacionProveedorDAO::search( new ClasificacionProveedor( array( "activa" => 1 ) ) ), $este_usuario->getIdClasificacionProveedor() );
//$form->createComboBoxJoin("id_tipo_almacen", "descripcion", array_diff(TipoAlmacenDAO::getAll(), TipoAlmacenDAO::search( new TipoAlmacen( array( "id_tipo_almacen" => 2 ) ) ) ), $este_almacen->getIdTipoAlmacen() );
$page->addComponent($form);
$page->render();
 /**
 	 *
 	 *Crear un nuevo producto,
 
 	 NOTA: Se crea un producto tipo = 1 que es para productos
 	 *
 	 * @param activo bool Si queremos que este activo o no este producto despues de crearlo.
 	 * @param codigo_producto string El codigo de control de la empresa para este producto, no se puede repetir
 	 * @param id_empresas json Objeto que contendra el arreglo de ids de las empresas a la que pertenece este producto
 	 * @param nombre_producto string Nombre del producto
 	 * @param metodo_costeo string  Mtodo de costeo del producto: 1 = Costo Promedio en Base a Entradas.2 = Costo Promedio en Base a Entradas Almacn.3 = ltimo costo.4 = UEPS.5 = PEPS.6 = Costo especfico.7 = Costo Estndar
 	 * @param costo_estandar float Valor del costo estndar del producto.
 	 * @param compra_en_mostrador bool Verdadero si este producto se puede comprar en mostrador, para aquello de compra-venta. Para poder hacer esto, el sistema debe poder hacer compras en mostrador
 	 * @param garant�a int Si este producto cuenta con un nmero de meses de garanta  que no aplica a los productos de su categora
 	 * @param costo_extra_almacen float Si este producto produce un costo extra por tenerlo en almacen
 	 * @param margen_de_utilidad float Un porcentage de 0 a 100 si queremos que este producto marque utilidad en especifico
 	 * @param control_de_existencia int 00000001 = Unidades. 00000010 = Caractersticas. 00000100 = Series. 00001000 = Pedimentos. 00010000 = Lote
 	 * @param peso_producto float el peso de este producto en KG
 	 * @param descripcion_producto string Descripcion larga del producto
 	 * @param impuestos json array de ids de impuestos que tiene este producto
 	 * @param clasificaciones json Uno o varios id_clasificacion de este producto, esta clasificacion esta dada por el usuarioArray
 	 * @param id_unidad_convertible int Si este producto se relacionara con una unidad convertible ( kilos, litros, libras, etc.)
 	 * @param codigo_de_barras string El Codigo de barras para este producto
 	 * @param id_unidad_no_convertible int Si este producto se relacionara con una unidad no convertible ( lotes, cajas, costales, etc.)
 	 * @param foto_del_producto string url a una foto de este producto
 	 * @param descuento float Descuento que se aplicara a este producot
 	 * @return id_producto int Id generado por la inserci�n del nuevo producto
 	 **/
 public static function Nuevo($activo, $codigo_producto, $compra_en_mostrador, $id_unidad_compra, $metodo_costeo, $nombre_producto, $visible_en_vc, $codigo_de_barras = null, $control_de_existencia = null, $costo_estandar = null, $descripcion_producto = null, $foto_del_producto = null, $garantia = null, $id_categoria = null, $id_empresas = null, $id_unidad = null, $impuestos = null, $precio_de_venta = null)
 {
     Logger::log("======= Creando nuevo producto `{$codigo_producto}` ==== ;");
     //valida los parametros recibidos
     /*$validar = self::validarParametrosProducto(null, $compra_en_mostrador, $metodo_costeo, $activo, $codigo_producto, $nombre_producto, $garantia, $costo_estandar, $id_unidad_compra, $control_de_existencia, $descripcion_producto, $foto_del_producto, $costo_extra_almacen = null, $codigo_de_barras, $peso_producto = null, $id_unidad, $precio_de_venta);
     
     
     
     		if (is_string($validar)) {
     			Logger::error($validar);
     			throw new Exception($validar);
     		} //is_string($validar)*/
     //buscar otro producto con el mismo codigo de producto
     $search = ProductoDAO::search(new Producto(array("codigo_producto" => $codigo_producto)));
     if (sizeof($search) > 0) {
         throw new BusinessLogicException("Ya hay un producto con ese codigo de producto");
     }
     //Se verifica que si se recibio precio como metodo de costeo, se reciba un precio,
     //o si se recibe margen, que se reciba un margen de utilidad.
     if ($metodo_costeo == "precio" && is_null($precio_de_venta)) {
         Logger::error("Se intenta registrar un producto con metodo de costeo precio sin especificar un precio");
         throw new InvalidDataException("Se intenta registrar un producto con metodo de costeo precio sin especificar un precio", 901);
     } else {
         if ($metodo_costeo == "costo" && is_null($costo_estandar)) {
             Logger::error("Se intenta registrar un producto con metodo de costeo costo sin especificar un costo");
             throw new Exception("Se intenta registrar un producto con metodo de costeo costo sin especificar un costo", 901);
         }
     }
     //$metodo_costeo == "costo" && is_null($costo_estandar)
     $costo_estandar = $metodo_costeo == "costo" ? $costo_estandar : null;
     //sólo en caso de que se haya seleccionado metodo_costeo == 'costo' tomar en cuenta este valor ver API
     $producto = new Producto(array("compra_en_mostrador" => $compra_en_mostrador, "metodo_costeo" => $metodo_costeo, "activo" => $activo, "codigo_producto" => trim($codigo_producto), "nombre_producto" => trim($nombre_producto), "visible_en_vc" => $visible_en_vc, "garantia" => $garantia, "costo_estandar" => $costo_estandar, "control_de_existencia" => $control_de_existencia, "descripcion" => $descripcion_producto, "foto_del_producto" => $foto_del_producto, "codigo_de_barras" => trim($codigo_de_barras), "id_unidad" => $id_unidad, "precio" => $precio_de_venta, "id_unidad_compra" => $id_unidad_compra));
     DAO::transBegin();
     try {
         //Se guarda el producto creado y se asignan las empresas, los impuestos y las clasificaciones recibidas
         ProductoDAO::save($producto);
         if (!is_null($id_empresas)) {
             if (!is_array($id_empresas)) {
                 $id_empresas = object_to_array($id_empresas);
             }
             //!is_array($id_empresas)
             if (!is_array($id_empresas)) {
                 throw new Exception("Las empresas fueron enviadas incorrectamente", 901);
             }
             //!is_array($id_empresas)
             $producto_empresa = new ProductoEmpresa(array("id_producto" => $producto->getIdProducto()));
             foreach ($id_empresas as $id_empresa) {
                 $validar = self::validarParametrosProductoEmpresa($id_empresa);
                 if (is_string($validar)) {
                     throw new BusinessLogicException($validar, 901);
                 }
                 $producto_empresa->setIdEmpresa($id_empresa);
                 Logger::log("vinculando producto con empresa " . $id_empresa);
                 ProductoEmpresaDAO::save($producto_empresa);
             }
             //$id_empresas as $id_empresa
         }
         //!is_null($id_empresas)
         if (!is_null($impuestos)) {
             $impuestos = object_to_array($impuestos);
             if (!is_array($impuestos)) {
                 throw new BusinessLogicException("Los impuestos fueron recibidos incorrectamente", 901);
             }
             //!is_array($impuestos)
             $impuesto_producto = new ImpuestoProducto(array("id_producto" => $producto->getIdProducto()));
             foreach ($impuestos as $impuesto) {
                 if (is_null(ImpuestoDAO::getByPK($impuesto))) {
                     throw new BusinessLogicException("El impuesto con id " . $impuesto . " no existe", 901);
                 }
                 $impuesto_producto->setIdImpuesto($impuesto);
                 ImpuestoProductoDAO::save($impuesto_producto);
             }
             //$impuestos as $impuesto
         }
         //!is_null($impuestos)
         /* Fin if de impuestos */
         /*
         if (!is_null($clasificaciones)) {
         	$clasificaciones = object_to_array($clasificaciones);
         
         	if (!is_array($clasificaciones)) {
         		throw new Exception("Las clasificaciones del producto fueron recibidas incorrectamente", 901);
         	} //!is_array($clasificaciones)
         
         	$producto_clasificacion = new ProductoClasificacion(array(
         		"id_producto" => $producto->getIdProducto()
         	));
         	foreach ($clasificaciones as $clasificacion) {
         		$c = ClasificacionProductoDAO::getByPK($clasificacion);
         		if (is_null($c))
         			throw new Exception("La clasificacion de producto con id " . $clasificacion . " no existe", 901);
         
         		if (!$c->getActiva())
         			throw new Exception("La clasificaicon de producto con id " . $clasificacion . " no esta activa", 901);
         
         		$producto_clasificacion->setIdClasificacionProducto($clasificacion);
         		ProductoClasificacionDAO::save($producto_clasificacion);
         	} //$clasificaciones as $clasificacion
         } //!is_null($clasificaciones)
         */
         /* Fin if de clasificaciones */
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo guardar el nuevo producto: " . $e);
         if ($e->getCode() == 901) {
             throw new BusinessLogicException("No se pudo guardar el nuevo producto: " . $e->getMessage(), 901);
         }
         throw new BusinessLogicException("No se pudo guardar el nuevo producto " . $e->getMessage(), 901);
     }
     DAO::transEnd();
     Logger::log("Producto creado exitosamente, id=" . $producto->getIdProducto());
     return array("id_producto" => (int) $producto->getIdProducto());
 }