new logic of adding posts - add user's balance

This commit is contained in:
saparatayev 2021-07-26 11:28:07 +05:00
parent 76b1b65a57
commit b1de3a66ae
10 changed files with 74 additions and 401 deletions

View File

@ -34,12 +34,6 @@ class OfferForm extends ComponentBase
*/
public $countries;
const REGISTRATION_URI = 'register.do';
const STATUS_URI = 'getOrderStatus.do';
const API_URL = 'https://mpi.gov.tm/payment/rest/';
public function componentDetails() {
return [
'name' => 'Offer Form',
@ -47,36 +41,7 @@ class OfferForm extends ComponentBase
];
}
public function onInput() {
$query = Input::get('query');
$locale = Session::get('rainlab.translate.locale');
if($query != '') {
if($locale == 'tm') {
// user enters product name
$products = Product
::where('name', 'like', "%${query}%")
->where('status','approved')
->get()->toArray();
} else {
$queryString = $query;
// user enters product name on ru, en
$products = Product::whereHas('translations', function ($query) use ($locale,$queryString) {
$query->where('locale', $locale)->where('attribute_data', 'like', "%${queryString}%");
})->where('status','approved')->get()->toArray();
}
} else {
$products = [];
}
$this->page['products'] = $products;
return [
'#suggestions' => $this->renderPartial('@suggestions')
];
}
// step1
public function onSave() {
$data = post();
@ -92,22 +57,22 @@ class OfferForm extends ComponentBase
$this->validateForm($data, $rules);
$category = Category::find(Input::get('category_id'));
$category = Category::find($data['category_id']);
$product = new Product;
$product->name = Input::get('name_tm');
$product->name = $data['name_tm'];
// Sets a single translated attribute for a language
$product->setAttributeTranslated('name', Input::get('name_ru'), 'ru');
$product->setAttributeTranslated('name', Input::get('name_en'), 'en');
$product->setAttributeTranslated('name', $data['name_ru'], 'ru');
$product->setAttributeTranslated('name', $data['name_en'], 'en');
// Sets a single translated attribute for a language
$product->setAttributeTranslated('slug', Str::slug(Input::get('name_ru'),'-'), 'ru');
$product->setAttributeTranslated('slug', Str::slug(Input::get('name_en'),'-'), 'en');
$product->setAttributeTranslated('slug', Str::slug($data['name_ru'],'-'), 'ru');
$product->setAttributeTranslated('slug', Str::slug($data['name_en'],'-'), 'en');
$product->slug = Str::slug(Input::get('name_tm'),'-');
$product->slug = Str::slug($data['name_tm'],'-');
$product->status = 'draft';
$product->mark = Input::get('mark');
$product->manufacturer = Input::get('manufacturer');
$product->country_id = Input::get('country_id');
$product->mark = $data['mark'];
$product->manufacturer = $data['manufacturer'];
$product->country_id = $data['country_id'];
$category->products()->save($product);
@ -124,6 +89,7 @@ class OfferForm extends ComponentBase
}
// step 2
public function onOfferFill() {
$data = input();
@ -134,7 +100,7 @@ class OfferForm extends ComponentBase
'description_tm' => 'required',
'description_en' => 'required',
'description_ru' => 'required',
'ends_at' => 'required|date',
// 'ends_at' => 'required|date',
'payment_term_id' => 'required',
'packaging' => 'required',
'delivery_term_id' => 'required',
@ -142,7 +108,6 @@ class OfferForm extends ComponentBase
'measure_id' => 'required',
'new_img' => 'required'
];
$this->validateForm($data, $rules);
// seaparate validation for file type
@ -160,150 +125,46 @@ class OfferForm extends ComponentBase
$attachedProduct = Product::find($data['product_id']);
$attachedProduct = $this->fillProduct($data,$attachedProduct);
// add images to completely new product
foreach($data['new_img'] as $key => $img) {
// add images to completely new product
$attachedProduct->images = $img;
$attachedProduct->save();
}
$draft_offers = \Auth::user()->products()
->where('status','draft')
->orderBy('created_at', 'desc')->get();
// $draft_offers = \Auth::user()->products()
// ->where('status','draft')
// ->orderBy('created_at', 'desc')->get();
$this->page['draft_offers'] = $draft_offers;
$this->page['draft_offers_count'] = count($draft_offers);
// $this->page['draft_offers'] = $draft_offers;
// $this->page['draft_offers_count'] = count($draft_offers);
$this->page['fee'] = Settings::getValue('fee');
$this->page['product'] = $attachedProduct;
return [
'#form-steps' => $this->renderPartial('@basket')
'#form-steps' => $this->renderPartial('@third_step_form')
];
}
public function onDeleteOfferFromBasket() {
// delete offer from basket, from db
$offer = Product::find(Input::get('offer_id'));
$offer->images()->delete();
$offer->translations()->delete();
$offer->delete();
// then display the rest of offers
$draft_offers = \Auth::user()->products()
->where('status','draft')
->orderBy('created_at', 'desc')->get();
$this->page['draft_offers'] = $draft_offers;
$this->page['draft_offers_count'] = count($draft_offers);
$this->page['fee'] = Settings::getValue('fee');
return [
'#form-steps' => $this->renderPartial('@basket')
];
}
public function onStartToPay() {
$data = input();
$rules = [
'pay_type' => 'required',
];
$this->validateForm($data, $rules);
$pay_type = $data['pay_type'];
if($pay_type == "bank") {
return [
'#form-steps' => $this->renderPartial('@bank_transfer_pay')
];
// step3
public function onPublish() {
$user = \Auth::user();
if($user->balance - Settings::getValue('fee') < 0) {
// ... message about not enough money
} else {
$url = $this->payOnline();
if(!$url) {
$this->page['err_message'] = 'Не удается подключиться к сервисам банка. Попробуйте позже';
return [
'#form-steps' => $this->renderPartial('@message')
];
}
$user->balance = $user->balance - Settings::getValue('fee');
$user->save();
$product = Product::find(Input::get('product_id'));
$product->status = 'new';
$product->save();
$this->page['url'] = $url;
return [
'#form-steps' => $this->renderPartial('@redirect')
'#form-steps' => $this->renderPartial('@message')
];
}
}
protected function payOnline() {
$payment = $this->createNewPayment(false, 'online');
$response = $this->registerOrder($payment);
$result = json_decode($response->body,true);
if($result['errorCode'] == 0){
$payment->order_id = $result['orderId'];
$payment->save();
return $result['formUrl'];
}
else{
return false;
// dd($result['formUrl']);
// throw new AjaxException(
// $result
// );
}
}
public function onPayByBankTransfer() {
$data = input();
$rules = [
'bank_file' => 'required|mimes:pdf,jpg,png',
];
$this->validateForm($data, $rules);
$this->createNewPayment(Input::file('bank_file'), 'bank');
return [
'#form-steps' => $this->renderPartial('@message')
];
}
protected function createNewPayment($bankFile, $payMethod) {
$newPayment = new Payment;
$newPayment->user_id = \Auth::user()->id;
$newPayment->created_at = Carbon::now('Asia/Ashgabat');
$draft_offers = \Auth::user()->products()
->where('status','draft')
->get();
$newPayment->amount = count($draft_offers) * Settings::getValue('fee');
$newPayment->payment_type = $payMethod;
$newPayment->status = "new";
$newPayment->save();
$newPaymentId = $newPayment->id;
DB::transaction(function() use ($draft_offers, $newPaymentId) {
foreach($draft_offers as $df) {
$df->payment_id = $newPaymentId;
$df->status = 'new';
$df->save();
}
});
// attach file to payment
if($bankFile) {
$newPayment->bank_file = $bankFile;
$newPayment->save();
}
return $newPayment;
}
protected function validateFileType($data, $rules) {
$validator = Validator::make($data, $rules);
@ -328,40 +189,13 @@ class OfferForm extends ComponentBase
}
}
protected function makeInsertionArray($attachedProduct,$newOffer) { //for binding images
$insertionArray = array();
$i = 0;
foreach($attachedProduct->images as $img) {
$insertionArray[] = [
'disk_name' => $img->disk_name,
'file_name' => $img->file_name,
'file_size' => $img->file_size,
'content_type' => $img->content_type,
'field' => $img->field,
'attachment_id' => $newOffer->id,
'attachment_type' => 'TPS\Birzha\Models\Offer',
'is_public' => $img->is_public
];
$i++;
if($i == 3) break; //only three first photos
}
return $insertionArray;
}
protected function fillProduct($data,$attachedProduct) {
// $newOffer = new Offer;
// $newOffer->product_id = $attachedProduct->id;
$attachedProduct->vendor_id = \Auth::user()->id;
$attachedProduct->description = $data['description_tm'];
// Sets a single translated attribute for a language
$attachedProduct->setAttributeTranslated('description', $data['description_ru'], 'ru');
$attachedProduct->setAttributeTranslated('description', $data['description_en'], 'en');
$attachedProduct->quantity = $data['quantity'];
$attachedProduct->price = $data['price'];
$attachedProduct->measure_id = $data['measure_id'];
@ -369,10 +203,9 @@ class OfferForm extends ComponentBase
$attachedProduct->delivery_term_id = $data['delivery_term_id'];
$attachedProduct->packaging = $data['packaging'];
$attachedProduct->place = $data['place'];
// $attachedProduct->name = $attachedProduct->name;
$attachedProduct->currency_id = $data['currency_id'];
$attachedProduct->created_at = Carbon::now('Asia/Ashgabat');
$attachedProduct->ends_at = $data['ends_at'];
// $attachedProduct->ends_at = $data['ends_at'];
$attachedProduct->save();
return $attachedProduct;
@ -382,33 +215,4 @@ class OfferForm extends ComponentBase
$this->countries = Country::all();
$this->categories = Category::select('id','name','status')->where('status',1)->get();
}
// payment
protected function registerOrder($payment) {
$client = self::getClient(self::REGISTRATION_URI);
$url = $this->controller->pageUrl('bank_result.htm', ['payment_id' => $payment->id]);
$client->data([
'amount' => $payment->amount * 100,//multiply by 100 to obtain tenge
'currency' => 934,
'description' => 'Kart üçin döwlet pajy.',
'orderNumber' => strtoupper(str_random(5)) . date('jn'),
'failUrl' => $url . '?status=success',
'returnUrl' => $url . '?status=failed',
]);
$client->setOption(CURLOPT_POSTFIELDS,$client->getRequestData());
// dd($client);
return $client->send();
}
private static function getClient($url){
return Http::make(self::API_URL.$url, Http::METHOD_POST)->data([
'userName' => Settings::getValue('api_login'),
'password' => Settings::getValue('api_password'),
])->timeout(120);
}
}

View File

@ -1,38 +0,0 @@
<div class="contact_title">
Bank transfer payment
</div>
<form class="post_form"
data-request="onPayByBankTransfer"
data-request-validate
data-request-flash
data-request-files>
<div class="post_upload_box">
<div class="post_upload_item">
<div class="post_input">
<label>Загрузить файл<span>*</span></label>
<span data-validate-for="bank_file" style="color: red;"></span>
<div class="upload_group">
<label for="file-1">Загрузить файл</label>
<div class="form_group">
<label class="additional">
<span>Ничего не выбранo</span>
</label>
<input type="file"
name="bank_file"
id="file-1" class="inputfile inputfile-1"
data-multiple-caption="{count} files selected"
/>
</div>
</div>
</div>
</div>
</div>
<div class="btn_bg">
<button class="post_btn" type="submit">
Отправить на биржу
</button>
</div>
</form>
<script src="{{ 'assets/js/custom-file-input.js'|theme }}"></script>
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>

View File

@ -1,112 +0,0 @@
<div class="contact_title">
Корзина
</div>
<div class="basket_box">
<div class="basket_data">
<div class="basket_table">
<table>
<thead>
<tr>
<th>Лот №:</th>
<th>Изображение</th>
<th>Товар</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
{% for offer in draft_offers %}
<tr>
<td>
№ {{offer.id}}
</td>
<td>
<div class="basket_img">
<img src="{{ offer.images[0].thumb(165,95,{'mode':'crop'}) }}" alt="cat_photo">
</div>
</td>
<td>
<div class="basket_item_title">
{{offer.name}}
</div>
<div class="basket_item_text">
{{offer.name}}
</div>
</td>
<td>
<a href="#"
data-request="onDeleteOfferFromBasket"
data-request-data="offer_id: {{ offer.id }}"
class="basket_delete">
<img src="{{ 'assets/images/svg/garbage.svg'|theme }}" alt="delete-icon">
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<form data-request="onStartToPay"
data-request-validate
data-request-flash
class="basket_info">
<div class="basket_info_title">
Стоимость
</div>
<div class="basket_info_item">
<div class="basket_info_box">
<div class="basket_info_name">
Цена за один пост:
</div>
<div class="basket_info_cash">
{{fee}} TMT
</div>
</div>
<div class="basket_info_box">
<div class="basket_info_name">
Количество постов:
</div>
<div class="basket_info_cash">
{{draft_offers_count}}
</div>
</div>
</div>
<div class="basket_info_item">
<div class="basket_info_box">
<div class="basket_info_name">
Итоговая сумма
</div>
<div class="basket_info_cash">
{{draft_offers_count * fee}} TMT
</div>
</div>
<div class="basket_info_select">
<label>Метод оплаты <span>*</span> <span data-validate-for="pay_type" style="color: red;"></span></label>
<div class="my-select">
<select class="category-select" name="pay_type">
<option value="">Method</option>
<option value="bank">Bank transfer</option>
<option value="online">Online payment</option>
</select>
</div>
</div>
<div class="btn_bg">
<button class="post_btn" type="submit" data-attach-loading>
Отправить на биржу
</button>
</div>
<a href="{{ 'kabinet/add_offer'|page }}" class="add_post_btn">
<div class="post_icon">
<img src="{{'assets/images/svg/add.svg'|theme}}" alt="">
</div>
<div class="post_text">
Добавить объявление
</div>
</a>
</div>
</form>
</div>
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>

View File

@ -76,7 +76,7 @@
<div class="btn_bg">
<button class="post_btn" type="submit" data-attach-loading>
Отправить на биржу
Шаг 2
</button>
</div>

View File

@ -1,18 +1,14 @@
<section class="thanks">
<div class="auto_container">
<div class="thanks_wrap">
{% if err_message is defined %}
<div class="thanks_text">
{{err_message}}
</div>
{% else %}
<div class="thanks_title">
Спасибо за оставленный вами запрос
</div>
<div class="thanks_text">
После проверки нашим Админом ваш лот будет размещен на нашем сайте!
</div>
{% endif %}
</div>
</div>
</section>

View File

@ -1,6 +0,0 @@
<script>
window.location.href = "{{url}}";
</script>
<!-- <div>
<h1>{{url}}</h1>
</div> -->

View File

@ -9,7 +9,6 @@
data-request-files
>
<input type="hidden" name="product_id" value="{{product.id}}">
<!-- <input type="hidden" name="product_exists" value="{{ product_exists }}"> -->
<div class="post_input">
<label>Единицы измерения <span>*</span> <span data-validate-for="measure_id" style="color: red;"></span></label>
@ -88,11 +87,11 @@
</div>
</div>
<div class="post_input">
<!-- <div class="post_input">
<label for="good-cost">Ends at <span>*</span> </label>
<input type="datetime-local" name="ends_at">
<span data-validate-for="ends_at" style="color: red;"></span>
</div>
</div> -->
<div class="post_comment">
<label for="description_ru">Описание (RU) <span>*</span></label>
@ -141,7 +140,7 @@
<div class="btn_bg">
<button class="post_btn" type="submit">
Отправить на биржу
Шаг 3
</button>
</div>

View File

@ -0,0 +1,30 @@
<div class="contact_title">
Добавить объявление (Step 3)
</div>
<form action="#" class="post_form" enctype="multipart/form-data"
data-request="onPublish"
>
<input type="hidden" name="product_id" value="{{product.id}}">
<div class="thanks_title">
За публикацию с вашего баланса будет снято {{fee}} TMT
</div>
<div class="btn_bg">
<button class="post_btn" type="submit">
Опубликовать
</button>
</div>
<div class="add_post_text">
Пункты отмеченные ( <span>*</span> ) обязательны для заполнения
</div>
</form>
<script src="{{ 'assets/js/custom-file-input.js'|theme }}"></script>
<script src="{{ 'assets/js/scrollTopOnSteps.js'|theme }}"></script>

View File

@ -48,7 +48,7 @@ fields:
span: auto
type: relation
price:
label: Number
label: Price
span: auto
type: number
description:

View File

@ -109,7 +109,7 @@ code = "main-top"
<img src="{{'assets/images/svg/user-plus.svg'|theme}}" alt="">
</div>
<div class="profile_text">
{{user.name}}
{{user.name}} Balance: {{user.balance}} TMT
</div>
<div class="prodile_arrow">
<img src="{{'assets/images/svg/arrow-down.svg'|theme}}" alt="">