Facturacion

Hola a todos. Soy nuevo dentro del framework y les agradeceria me puedan iluminar con cierta duda.

Quiero realizar una formulario de una factura, con su encabezado y su detalle, en lo que tengo problemas es en saber que widget utilizar para el detalle o de que manera manejarlo, es decir que el usuario pueda ingresar el codigo y con el framework manejar los demas parametros (ya se nombre, precio subtotales y otros).

Gracias de antemano!

Hola, si solo quieres mostrar los detalles de una factura, sin hacer una búsqueda previa, podrías utilizar un pequeño formulario para pedir el numero y buscar, y utilizar un div que contenga un DetailView con los detalles del documento encontrado o un mensaje en caso de no encontrarlo.

El submit del form lo podrías hacer con ajax y llenar el div de manera dinámica.

Pero si lo que quieres es realizar una búsqueda y de acuerdo a los resultados mostrar sus detalles, entonces te sugiero que hagas una vista parecida a la de ‘admin’ (o utilizar esa vista, solo cambia los permisos en el controlador y modifica la ButtonColumn del gridview) que genera el CRUD para mostrar los detalles.

Espero te sea de utilidad mi comentario.

Saludos!.

Gracias por tu respuesta! De casualidad tendras algun ejemplo o algun sitio donde se explique como realizarlo? Es que con lo que es detalles y ajax soy muy nuevo…

Saludos!

Busca en yiiplayground.com… tiene un ejemplo de ajax/jquery te puede dar una idea, si tengo un poco mas de tiempo tratare de hacerte un ejemnplo

Saludos!.

Va el ejemplo

Tabla factura:

±---------±------------±-----±----±--------±---------------+

| Field | Type | Null | Key | Default | Extra |

±---------±------------±-----±----±--------±---------------+

| numero | int(11) | NO | PRI | NULL | auto_increment |

| fecha | date | NO | | NULL | |

| concepto | varchar(45) | NO | | NULL | |

| total | varchar(45) | NO | | NULL | |

±---------±------------±-----±----±--------±---------------+

con los siguientes valores:

mysql> select * from factura;

±-------±-----------±----------±--------+

| numero | fecha | concepto | total |

±-------±-----------±----------±--------+

| 1 | 2012-11-22 | GASOLINA | $300.00 |

| 2 | 2012-11-22 | ALIMNETOS | $250.00 |

±-------±-----------±----------±--------+

Genera el modelo y el CRUD para factura con Gii.

Para efectos prácticos la consulta se realizará desde site/index (inicio)

vista site/index

index.php :




<?php $this->pageTitle=Yii::app()->name; 




//se agrega el script que envia la petición y muestra el resultado en el div

Yii::app()->clientScript->registerScript('busqueda', "


//cuando se haga el submit del formilario fbusqueda

$('#fbusqueda').submit(function(){

	//se hace via ajax

	$.ajax({

        type: 'GET',

        url: $(this).attr('action'),    //factura/getdetalles

        data:$(this).serialize(),       //se envia el contenido del formulario

        success: function(html){        //si es correcto

            $('#resultado').html('');   //se limpia el div 'resultado'

            $('#resultado').html(html); //se llena con el resultado devuelto

        },

    });

    return false;   //no se completa el submit, ya que se hizo via ajax

});

");

?>


<h1>Buscar factura</h1>


<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'fbusqueda',                                      //id del formulario

	'action'=>Yii::app()->createUrl('factura/getdetalles'), //metodo en el controlador factura para mostrar los detalles

	'method'=>'get',                                        

)); ?>


	<div class="row">

		<?php echo 'Número de factura:'; ?>

		<?php echo $form->textField($model,'numero'); ?>

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton('Buscar'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->


<!-- Div que muestra el resultado de la busqueda -->

<div id="resultado">


<i>Ingrese el número de factura</i>


</div>



En el controlador FacturaController agrega una función llamada ‘ActionGetdetalles’ y agregala a las reglas de acceso de acuerdo a tus necesidades, en el ejemplo se le permite a cualquier persona.

FacturaController.php :





<?php


class FacturaController extends Controller

{

	/**

	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning

	 * using two-column layout. See 'protected/views/layouts/column2.php'.

	 */

	public $layout='//layouts/column2';


	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view', 'getdetalles'), //se agrega 'getdetalles' para tener acceso

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}


	/**

	 * Displays a particular model.

	 * @param integer $id the ID of the model to be displayed

	 */

	public function actionView($id)

	{

		$this->render('view',array(

			'model'=>$this->loadModel($id),

		));

	}


	/**

	 * Creates a new model.

	 * If creation is successful, the browser will be redirected to the 'view' page.

	 */

	public function actionCreate()

	{

		$model=new Factura;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Factura']))

		{

			$model->attributes=$_POST['Factura'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->numero));

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'view' page.

	 * @param integer $id the ID of the model to be updated

	 */

	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Factura']))

		{

			$model->attributes=$_POST['Factura'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->numero));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}


	/**

	 * Deletes a particular model.

	 * If deletion is successful, the browser will be redirected to the 'admin' page.

	 * @param integer $id the ID of the model to be deleted

	 */

	public function actionDelete($id)

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$this->loadModel($id)->delete();


			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

			if(!isset($_GET['ajax']))

				$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	/**

	 * Lists all models.

	 */

	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('Factura');

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new Factura('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['Factura']))

			$model->attributes=$_GET['Factura'];


		$this->render('admin',array(

			'model'=>$model,

		));

	}


	/**

	 * Returns the data model based on the primary key given in the GET variable.

	 * If the data model is not found, an HTTP exception will be raised.

	 * @param integer the ID of the model to be loaded

	 */

	public function loadModel($id)

	{

		$model=Factura::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}


	/**

	 * Performs the AJAX validation.

	 * @param CModel the model to be validated

	 */

	protected function performAjaxValidation($model)

	{

		if(isset($_POST['ajax']) && $_POST['ajax']==='factura-form')

		{

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}

	}

	

	//envía una vista con los detalles de la factura

	public function actionGetdetalles(){

		//se valida que se recibe algo

		if(isset($_GET['Factura']))

			$model=Factura::model()->findByPk($_GET['Factura']['numero']);

		//si NO se encuentra la factura

		if($model===null)

		// se manda un mensaje de error

		echo '<div class="flash-notice">No se encontro la factura</div>';

		else

		//se hace un renderpartial con la vista 'view' con el la factura encontrada

		$this->renderPartial('view',array(

			'model'=>$model,

		));

		

	}		

}



Espero sea de tu utilidad.

Saludos!.

Gracias por tu ayuda!

Eso esta bien, sin embargo , lapregunta va orientada a "simular" , los formularios de las aplicaiones Escritorio, en especial los eventos de los controles, y en esto un detalle que no tengo idea de como hacerlo, pero tengo la seguridad qeu YII, posse herramientas para hacerlo :

Por ejemplo en el detalle, solo con colocar el codigo de un producto y presionar ENTER , inmediatamente me pinta su descripcion y su precio. Perfecto, esto se puede hacer con AJAX, sin embargo colocar al Text Input una ayuda (Matchcode) , al estilo del "CJuiDatePicker " pero en lugar de mostrar las fechas a elegir , mostrar el catalogo de productos x por ejemplo en una ventana modal con sus repectivas opciones para filtrar los datos hasta hallar el codigo buscado, al momento de selccionar el valor la venta desaprece y retora el codigo selccionado, la pinta en el inputtext. ¿Que herreminatas me recomiendan?

Estimado, m estuve haciendo esta pregunta por mucho tiempo y encontre la solucion :

Las aplicaciones escritorio, parecian inigualables con eso del MATCHCODE, que es fundamental para

ingresar datos, imagina una lista de materiles representadas por un combo box, eso es algo ridiculo.

Lo que hice fue desarrollar un Widget personalizado que contiene :

Una caja de texto con un evento AJAX, cuando hace el valid, esta caja de texto es parte del campo del modelo en el form


Una imagen simulando un boton con hipervinculo para abrir un cuadro de dialogo


Un Div Para &quot;pintar&quot; el texto buscado 





Al momento de hacer click, se abre el CJuidialog, y carga una vista hecha con anterioridad, luego 


ña grilla tiene un checkbox para elegir la fila seleccionada, al moneto de acpetar , el CJUIDIALOG, devuelve la clave solicitada  y la pinta en el cuadro de texto 

Luego de que se ha intado el valor en el cuadro de texto, al hacer valid se pinta el valor de la descripcion

Saludos

Saludos