Agregar, editar y eliminar promociones
This commit is contained in:
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
final class AlterPromotionsNullDates extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change(): void
|
||||||
|
{
|
||||||
|
$this->table('promotions')
|
||||||
|
->changeColumn('end_date', 'date', ['null' => true])
|
||||||
|
->changeColumn('valid_until', 'date', ['null' => true])
|
||||||
|
->update();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
final class AlterPromotionsAddDescriptionAndType extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change(): void
|
||||||
|
{
|
||||||
|
$this->table('promotions')
|
||||||
|
->addColumn('description', 'string', ['limit' => 255, 'null' => false, 'after' => 'id'])
|
||||||
|
->addColumn('type', 'integer', ['limit' => 1, 'null' => false, 'default' => 0, 'after' => 'description'])
|
||||||
|
->update();
|
||||||
|
}
|
||||||
|
}
|
10
app/resources/routes/api/ventas/promotions.php
Normal file
10
app/resources/routes/api/ventas/promotions.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
use Incoviba\Controller\API\Ventas\Promotions;
|
||||||
|
|
||||||
|
$app->group('/promotions', function($app) {
|
||||||
|
$app->post('/add[/]', [Promotions::class, 'add']);
|
||||||
|
$app->post('/edit[/]', [Promotions::class, 'edit']);
|
||||||
|
});
|
||||||
|
$app->group('/promotion/{promotion_id}', function($app) {
|
||||||
|
$app->delete('/remove[/]', [Promotions::class, 'remove']);
|
||||||
|
});
|
6
app/resources/routes/ventas/promotions.php
Normal file
6
app/resources/routes/ventas/promotions.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
use Incoviba\Controller\Ventas\Promotions;
|
||||||
|
|
||||||
|
$app->group('/promotions', function($app) {
|
||||||
|
$app->get('[/]', Promotions::class);
|
||||||
|
});
|
172
app/resources/views/ventas/promotions.blade.php
Normal file
172
app/resources/views/ventas/promotions.blade.php
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
@extends('ventas.promotions.base')
|
||||||
|
|
||||||
|
@section('promotions_content')
|
||||||
|
<table class="ui table" id="promotions">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Promoción</th>
|
||||||
|
<th>Tipo</th>
|
||||||
|
<th>Valor</th>
|
||||||
|
<th>Fecha Inicio</th>
|
||||||
|
<th>Fecha Término</th>
|
||||||
|
<th>Válido Hasta</th>
|
||||||
|
<th>Contratos</th>
|
||||||
|
<th class="right aligned">
|
||||||
|
<button type="button" class="ui small tertiary green icon button" id="add_button">
|
||||||
|
<i class="plus icon"></i>
|
||||||
|
</button>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($promotions as $promotion)
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{{ $urls->base }}/ventas/promotion/{{ $promotion->id }}">
|
||||||
|
{{ $promotion->description }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ ucwords($promotion->type->name()) }}</td>
|
||||||
|
<td>{{ ($promotion->type === Incoviba\Model\Venta\Promotion\Type::FIXED) ? $format->ufs($promotion->amount) : $format->percent($promotion->amount, 2, true) }}</td>
|
||||||
|
<td>{{ $promotion->startDate->format('d-m-Y') }}</td>
|
||||||
|
<td>{{ $promotion->endDate?->format('d-m-Y') }}</td>
|
||||||
|
<td>{{ $promotion->validUntil?->format('d-m-Y') }}</td>
|
||||||
|
<td>
|
||||||
|
Proyectos: {{ count(array_unique(array_map(function ($contract) { return $contract->project->descripcion; }, $promotion->contracts()))) }} <br />
|
||||||
|
Operadores: {{ count(array_unique(array_map(function ($contract) { return $contract->broker->name; }, $promotion->contracts()))) }}
|
||||||
|
</td>
|
||||||
|
<td class="right aligned">
|
||||||
|
<button type="button" class="ui small tertiary icon button edit_button" data-id="{{ $promotion->id }}">
|
||||||
|
<i class="edit icon"></i>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="ui red small tertiary icon button remove_button" data-id="{{ $promotion->id }}">
|
||||||
|
<i class="trash icon"></i>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
@include('ventas.promotions.add_modal')
|
||||||
|
@include('ventas.promotions.edit_modal')
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('page_scripts')
|
||||||
|
<script>
|
||||||
|
const promotions = {
|
||||||
|
ids: {
|
||||||
|
buttons: {
|
||||||
|
add: '',
|
||||||
|
edit: '',
|
||||||
|
remove: ''
|
||||||
|
},
|
||||||
|
},
|
||||||
|
handlers: {
|
||||||
|
add: null,
|
||||||
|
edit: null,
|
||||||
|
},
|
||||||
|
data: JSON.parse('{!! json_encode($promotions) !!}'),
|
||||||
|
execute() {
|
||||||
|
return {
|
||||||
|
add: data => {
|
||||||
|
const url = '{{$urls->api}}/ventas/promotions/add'
|
||||||
|
const method = 'post'
|
||||||
|
const body = new FormData()
|
||||||
|
body.set('promotions[]', JSON.stringify(data))
|
||||||
|
return APIClient.fetch(url, {method, body}).then(response => {
|
||||||
|
if (!response) {
|
||||||
|
console.error(response.errors)
|
||||||
|
alert('No se pudo agregar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return response.json().then(json => {
|
||||||
|
if (!json.success) {
|
||||||
|
console.error(json.errors)
|
||||||
|
alert('No se pudo agregar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
window.location.reload()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
edit: data => {
|
||||||
|
const url = '{{$urls->api}}/ventas/promotions/edit'
|
||||||
|
const method = 'post'
|
||||||
|
const body = new FormData()
|
||||||
|
body.set('promotions[]', JSON.stringify(data))
|
||||||
|
return APIClient.fetch(url, {method, body}).then(response => {
|
||||||
|
if (!response) {
|
||||||
|
console.error(response.errors)
|
||||||
|
alert('No se pudo editar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return response.json().then(json => {
|
||||||
|
if (!json.success) {
|
||||||
|
console.error(json.errors)
|
||||||
|
alert('No se pudo editar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
window.location.reload()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
remove: promotion_id => {
|
||||||
|
const url = `{{$urls->api}}/ventas/promotion/${promotion_id}/remove`
|
||||||
|
const method = 'delete'
|
||||||
|
return APIClient.fetch(url, {method}).then(response => {
|
||||||
|
if (!response) {
|
||||||
|
console.error(response.errors)
|
||||||
|
alert('No se pudo eliminar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return response.json().then(json => {
|
||||||
|
if (!json.success) {
|
||||||
|
console.error(json.errors)
|
||||||
|
alert('No se pudo eliminar promoción.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
window.location.reload()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch() {
|
||||||
|
document.getElementById(promotions.ids.buttons.add).addEventListener('click', clickEvent => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
promotions.handlers.add.show()
|
||||||
|
})
|
||||||
|
Array.from(document.getElementsByClassName(promotions.ids.buttons.edit)).forEach(button => {
|
||||||
|
button.addEventListener('click', clickEvent => {
|
||||||
|
const id = clickEvent.currentTarget.dataset.id
|
||||||
|
promotions.handlers.edit.load(id)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
Array.from(document.getElementsByClassName(promotions.ids.buttons.remove)).forEach(button => {
|
||||||
|
button.addEventListener('click', clickEvent => {
|
||||||
|
clickEvent.preventDefault()
|
||||||
|
const id = clickEvent.currentTarget.dataset.id
|
||||||
|
promotions.execute().remove(id)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
setup(ids) {
|
||||||
|
promotions.ids = ids
|
||||||
|
|
||||||
|
promotions.handlers.add = new AddModal()
|
||||||
|
promotions.handlers.edit = new EditModal(promotions.data)
|
||||||
|
|
||||||
|
promotions.watch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$(document).ready(() => {
|
||||||
|
promotions.setup({
|
||||||
|
buttons: {
|
||||||
|
add: 'add_button',
|
||||||
|
edit: 'edit_button',
|
||||||
|
remove: 'remove_button'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
100
app/resources/views/ventas/promotions/add_modal.blade.php
Normal file
100
app/resources/views/ventas/promotions/add_modal.blade.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<div class="ui modal" id="add_promotion_modal">
|
||||||
|
<div class="header">
|
||||||
|
Agregar Promoción
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<form class="ui form" id="add_promotion_form">
|
||||||
|
<div class="field">
|
||||||
|
<label for="description">Descripción</label>
|
||||||
|
<input type="text" id="description" name="description" placeholder="Descripción" required />
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="type">Tipo</label>
|
||||||
|
<select id="type" name="type" class="ui select dropdown" required>
|
||||||
|
<option value="1">Valor Fijo</option>
|
||||||
|
<option value="2">Valor Variable</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="value">Valor</label>
|
||||||
|
<input type="text" id="value" name="value" placeholder="Valor" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="start_date">Fecha de Inicio</label>
|
||||||
|
<div class="ui calendar" id="start_date">
|
||||||
|
<div class="ui left icon input">
|
||||||
|
<i class="calendar icon"></i>
|
||||||
|
<input type="text" name="start_date" placeholder="Fecha de Inicio" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="end_date">Fecha de Término</label>
|
||||||
|
<div class="ui calendar" id="end_date">
|
||||||
|
<div class="ui left icon input">
|
||||||
|
<i class="calendar icon"></i>
|
||||||
|
<input type="text" name="end_date" placeholder="Fecha de Término" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="valid_range">Válido por N Días Después del Término</label>
|
||||||
|
<input type="text" id="valid_range" name="valid_range" placeholder="Válido por N Días" value="7" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="actions">
|
||||||
|
<div class="ui black deny button">
|
||||||
|
Cancelar
|
||||||
|
</div>
|
||||||
|
<div class="ui positive right labeled icon button">
|
||||||
|
Agregar
|
||||||
|
<i class="checkmark icon"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@push('page_scripts')
|
||||||
|
<script>
|
||||||
|
class AddModal {
|
||||||
|
ids = {
|
||||||
|
modal: '#add_promotion_modal',
|
||||||
|
}
|
||||||
|
modal
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.modal = $(this.ids.modal)
|
||||||
|
this.modal.find('.ui.dropdown').dropdown()
|
||||||
|
this.modal.find('.ui.calendar').calendar(calendar_date_options)
|
||||||
|
this.modal.modal({
|
||||||
|
onApprove: () => {
|
||||||
|
const form = document.getElementById('add_promotion_form')
|
||||||
|
const type = $(form.querySelector('[name="type"]')).dropdown('get value')
|
||||||
|
const start_date = $(form.querySelector('#start_date')).calendar('get date')
|
||||||
|
const end_date = $(form.querySelector('#end_date')).calendar('get date')
|
||||||
|
let valid_until = null
|
||||||
|
if (end_date !== null) {
|
||||||
|
valid_until = new Date(end_date)
|
||||||
|
valid_until.setDate(valid_until.getDate() + parseInt(form.querySelector('[name="valid_range"]').value))
|
||||||
|
}
|
||||||
|
const data = {
|
||||||
|
description: form.querySelector('[name="description"]').value,
|
||||||
|
type,
|
||||||
|
value: form.querySelector('[name="value"]').value,
|
||||||
|
start_date: [start_date.getFullYear(), start_date.getMonth() + 1, start_date.getDate()].join('-'),
|
||||||
|
end_date: end_date === null ? null : [end_date.getFullYear(), end_date.getMonth() + 1, end_date.getDate()].join('-'),
|
||||||
|
valid_until: valid_until === null ? null : [valid_until.getFullYear(), valid_until.getMonth() + 1, valid_until.getDate()].join('-'),
|
||||||
|
}
|
||||||
|
promotions.execute().add(data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
show() {
|
||||||
|
this.modal.modal('show')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endpush
|
10
app/resources/views/ventas/promotions/base.blade.php
Normal file
10
app/resources/views/ventas/promotions/base.blade.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
@extends('layout.base')
|
||||||
|
|
||||||
|
@section('page_content')
|
||||||
|
<div class="ui container">
|
||||||
|
<h2 class="ui header">
|
||||||
|
Promociones
|
||||||
|
</h2>
|
||||||
|
@yield('promotions_content')
|
||||||
|
</div>
|
||||||
|
@endsection
|
126
app/resources/views/ventas/promotions/edit_modal.blade.php
Normal file
126
app/resources/views/ventas/promotions/edit_modal.blade.php
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<div class="ui modal" id="edit_promotion_modal">
|
||||||
|
<div class="header">
|
||||||
|
Editar Promoción - <span class="description"></span>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<form class="ui form" id="edit_promotion_form">
|
||||||
|
<input type="hidden" name="id" />
|
||||||
|
<div class="field">
|
||||||
|
<label for="description">Descripción</label>
|
||||||
|
<input type="text" id="description" name="description" placeholder="Descripción" required />
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="type">Tipo</label>
|
||||||
|
<select id="type" name="type" class="ui select dropdown" required>
|
||||||
|
<option value="1">Valor Fijo</option>
|
||||||
|
<option value="2">Valor Variable</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="value">Valor</label>
|
||||||
|
<input type="text" id="value" name="value" placeholder="Valor" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="edit_start_date">Fecha de Inicio</label>
|
||||||
|
<div class="ui calendar" id="edit_start_date">
|
||||||
|
<div class="ui left icon input">
|
||||||
|
<i class="calendar icon"></i>
|
||||||
|
<input type="text" name="edit_start_date" placeholder="Fecha de Inicio" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="edit_end_date">Fecha de Término</label>
|
||||||
|
<div class="ui calendar" id="edit_end_date">
|
||||||
|
<div class="ui left icon input">
|
||||||
|
<i class="calendar icon"></i>
|
||||||
|
<input type="text" name="edit_end_date" placeholder="Fecha de Término" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="valid_range">Válido por N Días Después del Término</label>
|
||||||
|
<input type="text" id="valid_range" name="valid_range" placeholder="Válido por N Días" value="7" required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="actions">
|
||||||
|
<div class="ui black deny button">
|
||||||
|
Cancelar
|
||||||
|
</div>
|
||||||
|
<div class="ui positive right labeled icon button">
|
||||||
|
Editar
|
||||||
|
<i class="checkmark icon"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@push('page_scripts')
|
||||||
|
<script>
|
||||||
|
class EditModal {
|
||||||
|
ids = {
|
||||||
|
modal: '#edit_promotion_modal',
|
||||||
|
}
|
||||||
|
modal
|
||||||
|
promotions
|
||||||
|
|
||||||
|
constructor(data) {
|
||||||
|
this.promotions = data
|
||||||
|
this.modal = $(this.ids.modal)
|
||||||
|
this.modal.find('.ui.dropdown').dropdown()
|
||||||
|
this.modal.find('.ui.calendar').calendar(calendar_date_options)
|
||||||
|
this.modal.modal({
|
||||||
|
onApprove: () => {
|
||||||
|
const form = document.getElementById('edit_promotion_form')
|
||||||
|
const type = $(form.querySelector('[name="type"]')).dropdown('get value')
|
||||||
|
const start_date = $(form.querySelector('#edit_start_date')).calendar('get date')
|
||||||
|
const end_date = $(form.querySelector('#edit_end_date')).calendar('get date')
|
||||||
|
let valid_until = null
|
||||||
|
if (end_date !== null) {
|
||||||
|
valid_until = new Date(end_date)
|
||||||
|
valid_until.setDate(valid_until.getDate() + parseInt(form.querySelector('[name="valid_range"]').value))
|
||||||
|
}
|
||||||
|
const data = {
|
||||||
|
id: form.querySelector('[name="id"]').value,
|
||||||
|
description: form.querySelector('[name="description"]').value,
|
||||||
|
type,
|
||||||
|
value: form.querySelector('[name="value"]').value,
|
||||||
|
start_date: [start_date.getFullYear(), start_date.getMonth() + 1, start_date.getDate()].join('-'),
|
||||||
|
end_date: end_date === null ? null : [end_date.getFullYear(), end_date.getMonth() + 1, end_date.getDate()].join('-'),
|
||||||
|
valid_until: valid_until === null ? null : [valid_until.getFullYear(), valid_until.getMonth() + 1, valid_until.getDate()].join('-'),
|
||||||
|
}
|
||||||
|
promotions.execute().edit(data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
load(promotion_id) {
|
||||||
|
const promotion = this.promotions.find(promotion => promotion.id === parseInt(promotion_id))
|
||||||
|
const form = document.getElementById('edit_promotion_form')
|
||||||
|
form.reset()
|
||||||
|
form.querySelector('[name="id"]').value = promotion.id
|
||||||
|
form.querySelector('[name="description"]').value = promotion.description
|
||||||
|
form.querySelector('[name="type"]').value = promotion.type
|
||||||
|
form.querySelector('[name="value"]').value = promotion.amount
|
||||||
|
const start_date_parts = promotion.start_date.split('-')
|
||||||
|
const start_date = new Date(start_date_parts[0], start_date_parts[1] - 1, start_date_parts[2])
|
||||||
|
$('#edit_start_date').calendar('set date', start_date)
|
||||||
|
if (promotion.end_date !== null) {
|
||||||
|
const end_date_parts = promotion.end_date.split('-')
|
||||||
|
const end_date = new Date(end_date_parts[0], end_date_parts[1] - 1, end_date_parts[2])
|
||||||
|
$('#edit_end_date').calendar('set date', end_date)
|
||||||
|
|
||||||
|
if (promotion.valid_until !== null) {
|
||||||
|
const valid_until_parts = promotion.valid_until.split('-')
|
||||||
|
const valid_until = new Date(valid_until_parts[0], valid_until_parts[1] - 1, valid_until_parts[2])
|
||||||
|
form.querySelector('[name="valid_range"]').value = valid_until.getDate() - end_date.getDate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.modal.modal('show')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endpush
|
97
app/src/Controller/API/Ventas/Promotions.php
Normal file
97
app/src/Controller/API/Ventas/Promotions.php
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Controller\API\Ventas;
|
||||||
|
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Incoviba\Controller\API\withJson;
|
||||||
|
use Incoviba\Exception\ServiceAction;
|
||||||
|
use Incoviba\Service;
|
||||||
|
|
||||||
|
class Promotions
|
||||||
|
{
|
||||||
|
use withJson;
|
||||||
|
|
||||||
|
public function add(ServerRequestInterface $request, ResponseInterface $response, Service\Venta\Promotion $promotionService): ResponseInterface
|
||||||
|
{
|
||||||
|
$input = $request->getParsedBody();
|
||||||
|
$output = [
|
||||||
|
'input' => $input,
|
||||||
|
'promotions' => [],
|
||||||
|
'success' => false,
|
||||||
|
'partial' => false,
|
||||||
|
'errors' => [],
|
||||||
|
];
|
||||||
|
if (is_string($input['promotions'])) {
|
||||||
|
$input['promotions'] = json_decode($input['promotions'], true);
|
||||||
|
}
|
||||||
|
foreach ($input['promotions'] as $promotion) {
|
||||||
|
try {
|
||||||
|
$promotionData = json_decode($promotion, true);
|
||||||
|
$promotion = $promotionService->add($promotionData);
|
||||||
|
$output['promotions'] []= [
|
||||||
|
'promotion' => $promotion,
|
||||||
|
'success' => true,
|
||||||
|
];
|
||||||
|
$output['partial'] = true;
|
||||||
|
} catch (ServiceAction\Create $exception) {
|
||||||
|
$output['errors'] []= $this->parseError($exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($output['promotions']) == count($input['promotions'])) {
|
||||||
|
$output['success'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->withJson($response, $output);
|
||||||
|
}
|
||||||
|
public function edit(ServerRequestInterface $request, ResponseInterface $response, Service\Venta\Promotion $promotionService): ResponseInterface
|
||||||
|
{
|
||||||
|
$input = $request->getParsedBody();
|
||||||
|
$output = [
|
||||||
|
'input' => $input,
|
||||||
|
'promotions' => [],
|
||||||
|
'success' => false,
|
||||||
|
'partial' => false,
|
||||||
|
'errors' => [],
|
||||||
|
];
|
||||||
|
if (is_string($input['promotions'])) {
|
||||||
|
$input['promotions'] = json_decode($input['promotions'], true);
|
||||||
|
}
|
||||||
|
foreach ($input['promotions'] as $promotion) {
|
||||||
|
try {
|
||||||
|
$promotionData = json_decode($promotion, true);
|
||||||
|
$promotion = $promotionService->getById($promotionData['id']);
|
||||||
|
unset($promotionData['id']);
|
||||||
|
$promotion = $promotionService->edit($promotion, $promotionData);
|
||||||
|
$output['promotions'] []= [
|
||||||
|
'promotion' => $promotion,
|
||||||
|
'success' => true,
|
||||||
|
];
|
||||||
|
$output['partial'] = true;
|
||||||
|
} catch (ServiceAction\Read | ServiceAction\Update $exception) {
|
||||||
|
$output['errors'] []= $this->parseError($exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($output['promotions']) == count($input['promotions'])) {
|
||||||
|
$output['success'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->withJson($response, $output);
|
||||||
|
}
|
||||||
|
public function remove(ServerRequestInterface $request, ResponseInterface $response, Service\Venta\Promotion $promotionService, int $promotion_id): ResponseInterface
|
||||||
|
{
|
||||||
|
$output = [
|
||||||
|
'promotion_id' => $promotion_id,
|
||||||
|
'promotion' => null,
|
||||||
|
'success' => false,
|
||||||
|
'errors' => [],
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$output['promotion'] = $promotionService->remove($promotion_id);
|
||||||
|
$output['success'] = true;
|
||||||
|
} catch (ServiceAction\Delete $exception) {
|
||||||
|
return $this->withError($response, $exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->withJson($response, $output);
|
||||||
|
}
|
||||||
|
}
|
19
app/src/Controller/Ventas/Promotions.php
Normal file
19
app/src/Controller/Ventas/Promotions.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Controller\Ventas;
|
||||||
|
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Incoviba\Common\Alias\View;
|
||||||
|
use Incoviba\Common\Ideal;
|
||||||
|
use Incoviba\Exception\ServiceAction;
|
||||||
|
use Incoviba\Service;
|
||||||
|
|
||||||
|
class Promotions extends Ideal\Controller
|
||||||
|
{
|
||||||
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta\Promotion $promotionService): ResponseInterface
|
||||||
|
{
|
||||||
|
$promotions = $promotionService->getAll('description');
|
||||||
|
|
||||||
|
return $view->render($response, 'ventas.promotions', ['promotions' => $promotions]);
|
||||||
|
}
|
||||||
|
}
|
16
app/src/Model/Venta/Promotion/Type.php
Normal file
16
app/src/Model/Venta/Promotion/Type.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Model\Venta\Promotion;
|
||||||
|
|
||||||
|
enum Type: int
|
||||||
|
{
|
||||||
|
case FIXED = 1;
|
||||||
|
case VARIABLE = 2;
|
||||||
|
|
||||||
|
public function name(): string
|
||||||
|
{
|
||||||
|
return match ($this) {
|
||||||
|
self::FIXED => 'fijo',
|
||||||
|
self::VARIABLE => 'variable'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user