From 3926498f3ea93b0b985cc8c2cfb71a56421b4209 Mon Sep 17 00:00:00 2001 From: Roland Schneider Date: Mon, 29 Feb 2016 07:40:36 +0100 Subject: [PATCH 1/2] fix togglekey asci chars --- frontend/models/KeyToggleForm.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/models/KeyToggleForm.php b/frontend/models/KeyToggleForm.php index d3af4a3..67da92f 100644 --- a/frontend/models/KeyToggleForm.php +++ b/frontend/models/KeyToggleForm.php @@ -7,6 +7,7 @@ use yii\base\Model; use common\models\CardKeyAssignment; use common\models\Key; use yii\helpers\ArrayHelper; +use common\components\Helper; /** * ContactForm is the model behind the contact form. @@ -43,6 +44,8 @@ class KeyToggleForm extends Model public function toggleKey(){ $query= Key::find(); + $this->key = Helper::fixAsciiChars($this->key); + $query->andWhere(['or', ['and',[ 'in','key.number' , [$this->key]],"trim(coalesce(key.number, '')) <>'' " ], ['and', ['in','key.rfid_key' ,[ $this->key ] ],"trim(coalesce(key.rfid_key, '')) <>'' "], From b196b8674665ca56b237b315083772c51d903d72 Mon Sep 17 00:00:00 2001 From: Roland Schneider Date: Mon, 29 Feb 2016 20:51:54 +0100 Subject: [PATCH 2/2] add inventory group --- backend/components/AdminMenuStructure.php | 1 + .../controllers/InventoryGroupController.php | 139 ++++++++++++++++++ backend/models/InventoryGroupSearch.php | 70 +++++++++ backend/views/inventory-group/_form.php | 35 +++++ backend/views/inventory-group/_search.php | 37 +++++ backend/views/inventory-group/create.php | 21 +++ backend/views/inventory-group/index.php | 40 +++++ backend/views/inventory-group/update.php | 21 +++ backend/views/inventory-group/view.php | 59 ++++++++ backend/views/product/_form.php | 6 + backend/views/product/view.php | 9 ++ changelog.txt | 4 + common/config/params.php | 2 +- common/models/InventoryGroup.php | 76 ++++++++++ common/models/Product.php | 17 ++- .../m160229_064305_inventory_group.php | 46 ++++++ frontend/models/ContractForm.php | 5 +- frontend/views/contract/_contract.php | 5 +- frontend/web/images/alairas.jpg | Bin 0 -> 14804 bytes 19 files changed, 589 insertions(+), 4 deletions(-) create mode 100644 backend/controllers/InventoryGroupController.php create mode 100644 backend/models/InventoryGroupSearch.php create mode 100644 backend/views/inventory-group/_form.php create mode 100644 backend/views/inventory-group/_search.php create mode 100644 backend/views/inventory-group/create.php create mode 100644 backend/views/inventory-group/index.php create mode 100644 backend/views/inventory-group/update.php create mode 100644 backend/views/inventory-group/view.php create mode 100644 common/models/InventoryGroup.php create mode 100644 console/migrations/m160229_064305_inventory_group.php create mode 100644 frontend/web/images/alairas.jpg diff --git a/backend/components/AdminMenuStructure.php b/backend/components/AdminMenuStructure.php index 55ca0a3..43ce4d0 100644 --- a/backend/components/AdminMenuStructure.php +++ b/backend/components/AdminMenuStructure.php @@ -90,6 +90,7 @@ class AdminMenuStructure{ $items = []; $items[] = ['label' => 'Termékek', 'url' => ['/product/index'] ]; $items[] = ['label' => 'Beszerzések', 'url' => ['/procurement/index'] ]; + $items[] = ['label' => 'Leltár csoport', 'url' => ['/inventory-group/index'] ]; $items[] = ['label' => 'Részletes eladások', 'url' => ['/transfer/sale' ,'TransferSaleSearch[start]' =>$todayDatetime,'TransferSaleSearch[end]' => $tomorrowDatetime ] ]; $items[] = ['label' => 'Termék összesítő', 'url' => ['/product/statistics' ,'ProductStatisticsSearch[start]' =>$todayDatetime,'ProductStatisticsSearch[end]' => $tomorrowDatetime ] ]; $this->menuItems[] = ['label' => 'Termékek', 'url' => $this->emptyUrl, diff --git a/backend/controllers/InventoryGroupController.php b/backend/controllers/InventoryGroupController.php new file mode 100644 index 0000000..2f5a5a0 --- /dev/null +++ b/backend/controllers/InventoryGroupController.php @@ -0,0 +1,139 @@ + [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['post'], + ], + ], + ]; + } + + /** + * Lists all InventoryGroup models. + * @return mixed + */ + public function actionIndex() + { + $searchModel = new InventoryGroupSearch(); + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); + + return $this->render('index', [ + 'searchModel' => $searchModel, + 'dataProvider' => $dataProvider, + ]); + } + + /** + * Displays a single InventoryGroup model. + * @param integer $id + * @return mixed + */ + public function actionView($id) + { + $model = $this->findModel($id); + + $products = Product::find()->andWhere(['id_inventory_group' => $model->id_inventory_group])->all(); + + $pdb = new ArrayDataProvider( + [ + 'pagination' => false, + 'sort' => false, + 'models' => $products + ] + ); + + return $this->render('view', [ + 'model' => $this->findModel($id), + 'products' => $pdb + ]); + } + + /** + * Creates a new InventoryGroup model. + * If creation is successful, the browser will be redirected to the 'view' page. + * @return mixed + */ + public function actionCreate() + { + $model = new InventoryGroup(); + + $model->status = InventoryGroup::STATUS_ACTIVE; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['index' ]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } + + + /** + * Updates an existing InventoryGroup model. + * If update is successful, the browser will be redirected to the 'view' page. + * @param integer $id + * @return mixed + */ + public function actionUpdate($id) + { + $model = $this->findModel($id); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['index' ]); + } else { + return $this->render('update', [ + 'model' => $model, + ]); + } + } + + /** + * Deletes an existing InventoryGroup model. + * If deletion is successful, the browser will be redirected to the 'index' page. + * @param integer $id + * @return mixed + */ + public function actionDelete($id) + { + $this->findModel($id)->delete(); + + return $this->redirect(['index']); + } + + /** + * Finds the InventoryGroup model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * @param integer $id + * @return InventoryGroup the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel($id) + { + if (($model = InventoryGroup::findOne($id)) !== null) { + return $model; + } else { + throw new NotFoundHttpException('The requested page does not exist.'); + } + } +} diff --git a/backend/models/InventoryGroupSearch.php b/backend/models/InventoryGroupSearch.php new file mode 100644 index 0000000..1b80a5f --- /dev/null +++ b/backend/models/InventoryGroupSearch.php @@ -0,0 +1,70 @@ + $query, + ]); + + $this->load($params); + + if (!$this->validate()) { + // uncomment the following line if you do not want to return any records when validation fails + // $query->where('0=1'); + return $dataProvider; + } + + $query->andFilterWhere([ + 'id_inventory_group' => $this->id_inventory_group, + 'id_product_category' => $this->id_product_category, + 'status' => $this->status, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]); + + $query->andFilterWhere(['like', 'name', $this->name]); + + return $dataProvider; + } +} diff --git a/backend/views/inventory-group/_form.php b/backend/views/inventory-group/_form.php new file mode 100644 index 0000000..0fffcc8 --- /dev/null +++ b/backend/views/inventory-group/_form.php @@ -0,0 +1,35 @@ + + + + + +
+ + + + field($model, 'name')->textInput(['maxlength' => true]) ?> + + field($model, 'id_product_category')->dropDownList($cats) ?> + + +
+ isNewRecord ? Yii::t('common/inventory_group', 'Létrehoz') : Yii::t('common/inventory_group', 'Módosít'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> +
+ + + +
diff --git a/backend/views/inventory-group/_search.php b/backend/views/inventory-group/_search.php new file mode 100644 index 0000000..97247d4 --- /dev/null +++ b/backend/views/inventory-group/_search.php @@ -0,0 +1,37 @@ + + + diff --git a/backend/views/inventory-group/create.php b/backend/views/inventory-group/create.php new file mode 100644 index 0000000..b9f0d8f --- /dev/null +++ b/backend/views/inventory-group/create.php @@ -0,0 +1,21 @@ +title = Yii::t('common/inventory_group', 'Create Inventory Group'); +$this->params['breadcrumbs'][] = ['label' => Yii::t('common/inventory_group', 'Inventory Groups'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/views/inventory-group/index.php b/backend/views/inventory-group/index.php new file mode 100644 index 0000000..77fa829 --- /dev/null +++ b/backend/views/inventory-group/index.php @@ -0,0 +1,40 @@ +title = Yii::t('common/inventory_group', 'Leltár csoportok'); +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ render('_search', ['model' => $searchModel]); ?> + +

+ 'btn btn-success']) ?> +

+ + $dataProvider, + 'columns' => [ + + 'id_inventory_group', + 'name', + [ + 'attribute' => 'id_product_category', + 'value' => 'productCategoryName' + ], + 'created_at:datetime', + + ['class' => 'yii\grid\ActionColumn', + 'template' => '{view} {update}' + ], + ], + ]); ?> + +
diff --git a/backend/views/inventory-group/update.php b/backend/views/inventory-group/update.php new file mode 100644 index 0000000..eaa7783 --- /dev/null +++ b/backend/views/inventory-group/update.php @@ -0,0 +1,21 @@ +title = Yii::t('common/inventory_group', 'Leltár csoport módosítása' ); +$this->params['breadcrumbs'][] = ['label' => Yii::t('common/inventory_group', 'Inventory Groups'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->id_inventory_group]]; +$this->params['breadcrumbs'][] = Yii::t('common/inventory_group', 'Update'); +?> +
+ +

title) ?>

+ + render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/backend/views/inventory-group/view.php b/backend/views/inventory-group/view.php new file mode 100644 index 0000000..c26c137 --- /dev/null +++ b/backend/views/inventory-group/view.php @@ -0,0 +1,59 @@ +title = $model->name; +$this->params['breadcrumbs'][] = ['label' => Yii::t('common/inventory_group', 'Leltár csoportok'), 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; + + + + + +?> +
+ +

title) ?>

+ +

+ $model->id_inventory_group], ['class' => 'btn btn-primary']) ?> +

+ + $model, + 'attributes' => [ + 'id_inventory_group', + 'name', + 'id_product_category', + 'created_at', + ], + ]) ?> + + +

Termékek a csoportban

+ $products, + 'columns' => [ + [ + 'attribute' =>'id_product', + 'label' => 'Termék azon' + ], + [ + 'attribute' =>'name', + 'label' => 'Termék neve' + ], + [ + 'attribute' =>'id_account', + 'value' => 'accountName', + 'label' => 'Kassza' + ] + ] + ])?> + +
diff --git a/backend/views/product/_form.php b/backend/views/product/_form.php index 182b4b5..bb477ae 100644 --- a/backend/views/product/_form.php +++ b/backend/views/product/_form.php @@ -3,6 +3,7 @@ use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\helpers\ArrayHelper; +use common\models\InventoryGroup; /* @var $this yii\web\View */ /* @var $model common\models\Product */ @@ -13,6 +14,9 @@ use yii\helpers\ArrayHelper; $account_options = ArrayHelper::map($accounts, 'id_account', 'name'); $product_category_options = ArrayHelper::map($categories, 'id_product_category', 'name'); +$inventory_groups = InventoryGroup::find()->andWhere(['status' => InventoryGroup::STATUS_ACTIVE])->all(); +$inventory_groups = ['' => ''] + ArrayHelper::map($inventory_groups, "id_inventory_group", "name"); + ?>
@@ -23,6 +27,8 @@ $product_category_options = ArrayHelper::map($categories, 'id_product_category', field($model, 'id_account')->dropDownList($account_options) ?> field($model, 'id_product_category')->dropDownList($product_category_options) ?> + + field($model, 'id_inventory_group')->dropDownList($inventory_groups) ?> field($model, 'product_number')->textInput(['maxlength' => true]) ?> diff --git a/backend/views/product/view.php b/backend/views/product/view.php index b59f1d0..30002c5 100644 --- a/backend/views/product/view.php +++ b/backend/views/product/view.php @@ -32,6 +32,10 @@ $this->params['breadcrumbs'][] = $this->title; 'statusHuman', 'stock', [ + 'attribute' => 'id_inventory_group', + 'value' => $model->getInventoryGroupName(), + ], + [ 'attribute' => 'description', 'value' => nl2br($model->description), 'format' => 'raw' @@ -40,5 +44,10 @@ $this->params['breadcrumbs'][] = $this->title; 'updated_at:datetime', ], ]) ?> + + +
diff --git a/changelog.txt b/changelog.txt index 0a498d4..15c3b54 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +-0.0.45 + - add inventory group + - fix contract already exists validator + - add contract sign image -0.0.44 - add common/config property assetmanager > timestamp -0.0.43 diff --git a/common/config/params.php b/common/config/params.php index b2467ad..e75efd0 100644 --- a/common/config/params.php +++ b/common/config/params.php @@ -4,7 +4,7 @@ return [ 'supportEmail' => 'rocho02@gmail.com', 'infoEmail' => 'info@rocho-net.hu', 'user.passwordResetTokenExpire' => 3600, - 'version' => 'v0.0.44', + 'version' => 'v0.0.45', 'company' => 'movar',//gyor 'company_name' => "Freimann Kft.", 'product_visiblity' => 'account',// on reception which products to display. account or global diff --git a/common/models/InventoryGroup.php b/common/models/InventoryGroup.php new file mode 100644 index 0000000..dc71ac0 --- /dev/null +++ b/common/models/InventoryGroup.php @@ -0,0 +1,76 @@ + 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id_inventory_group' => Yii::t('common/inventory_group', 'Leltár cs. azon.'), + 'name' => Yii::t('common/inventory_group', 'Név'), + 'id_product_category' => Yii::t('common/inventory_group', 'Termék kategória'), + 'status' => Yii::t('common/inventory_group', 'Státusz'), + 'created_at' => Yii::t('common/inventory_group', 'Létrehozva'), + ]; + } + + public function getProductCategory( ) { + return $this->hasOne(ProductCategory::className(),[ "id_product_category" => "id_product_category" ]); + } + + + public function getProductCategoryName( ) { + $result = ""; + $cat = $this->productCategory; + + if ( isset($cat)){ + $result = $cat->name; + } + + + return $result; + + } + + +} diff --git a/common/models/Product.php b/common/models/Product.php index 928a5b8..927787a 100644 --- a/common/models/Product.php +++ b/common/models/Product.php @@ -46,7 +46,7 @@ class Product extends \common\models\BaseFitnessActiveRecord { { return [ [['id_product_category', 'id_account', 'name'], 'required'], - [['id_product_category', 'id_account', 'purchase_price', 'sale_price', 'profit_margins', 'status'], 'integer'], + [['id_inventory_group', 'id_product_category', 'id_account', 'purchase_price', 'sale_price', 'profit_margins', 'status'], 'integer'], [['product_number', 'barcode'], 'string', 'max' => 20], [['product_number', 'barcode'], 'filter', 'filter' => 'trim', 'skipOnArray' => true], [['name'], 'string', 'max' => 128], @@ -87,6 +87,7 @@ class Product extends \common\models\BaseFitnessActiveRecord { 'description' => Yii::t('common/product', 'Description'), 'created_at' => Yii::t('common/product', 'Created At'), 'updated_at' => Yii::t('common/product', 'Updated At'), + 'id_inventory_group' => Yii::t('common/product', 'Leltár csoport'), ]; } @@ -99,6 +100,20 @@ class Product extends \common\models\BaseFitnessActiveRecord { public function getAccountName() { return $this->account->name; } + + public function getInventoryGroup() { + return $this->hasOne ( InventoryGroup::className (), [ + 'id_inventory_group' => 'id_inventory_group' + ] ); + } + public function getInventoryGroupName() { + $result = ""; + $inventoryGroup = $this->inventoryGroup; + if ( isset($inventoryGroup)){ + $result = $inventoryGroup->name; + } + return $result; + } public function getProductCategory() { return $this->hasOne ( ProductCategory::className (), [ diff --git a/console/migrations/m160229_064305_inventory_group.php b/console/migrations/m160229_064305_inventory_group.php new file mode 100644 index 0000000..d895e02 --- /dev/null +++ b/console/migrations/m160229_064305_inventory_group.php @@ -0,0 +1,46 @@ +db->driverName === 'mysql') { + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; + } + + $this->createTable('{{%inventory_group}}', [ + 'id_inventory_group' => $this->primaryKey(), + 'name' => $this->string(), + 'id_product_category' => $this->integer(11), + 'status' => $this->integer(11), + 'created_at' => $this->dateTime()->notNull(), + 'updated_at' => $this->dateTime()->notNull(), + ], $tableOptions); + + + $this->addColumn("product", "id_inventory_group", "int default null"); + } + + public function down() + { + echo "m160229_064305_inventory_group cannot be reverted.\n"; + + return false; + } + + /* + // Use safeUp/safeDown to run migration code within a transaction + public function safeUp() + { + } + + public function safeDown() + { + } + */ +} diff --git a/frontend/models/ContractForm.php b/frontend/models/ContractForm.php index da434d9..63c8f72 100644 --- a/frontend/models/ContractForm.php +++ b/frontend/models/ContractForm.php @@ -132,7 +132,10 @@ class ContractForm extends Model { if (! isset ( $this->ticketType )) { $this->addError ( $attribute, "Bérlet típus nem található" ); }else{ - $contracts = Contract::find()->andWhere(['>' ,'contract.expired_at', date('Y-m-d')])->andWhere(['not in' ,'contract.flag',[Contract::$FLAG_DELETED]])->all(); + $contracts = Contract::find() + ->andWhere( ['>' ,'contract.expired_at', date('Y-m-d')]) + ->andWhere(['not in' ,'contract.flag',[Contract::$FLAG_DELETED]]) + ->andWhere(['contract.id_customer' => $this->customer->id_customer])->all(); if ( count($contracts) > 0 ){ $this->addError( $attribute , "Már van érvényes vagy lemondott szerződés az adott időszakban"); } diff --git a/frontend/views/contract/_contract.php b/frontend/views/contract/_contract.php index 95d2de1..38c31f3 100644 --- a/frontend/views/contract/_contract.php +++ b/frontend/views/contract/_contract.php @@ -24,6 +24,8 @@ use common\components\Azaz; $ticketMoneyMonthText = $azaz->toString($ticketMoneyMonth); $customerBankName = $customer->bank_name; + $img = ""; + ?> @@ -153,7 +155,8 @@ másrészről:

-
+ + diff --git a/frontend/web/images/alairas.jpg b/frontend/web/images/alairas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c4e107e7e1c8fc0b4b48d5ab452b0fa096cc882 GIT binary patch literal 14804 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 Dh9dvm literal 0 HcmV?d00001