<?php
2
3/**
4 * Controller de Cheques
5 *
6 * @package Controllers
7 * @author Allan/Postali
8 */
9
10use Navigation\JsonTransaction;
11use Dynamic\Dynamic;
12use Navigation\Page;
13
14use Gazin\Cheques\CMS as ChequesCMS;
15use Gazin\Cheques\Model as ChequesModel;
16
17class Cheques extends Gazin\Gazin
18{
19 use FileTrait;
20
21 /**
22 * Construtor da página
23 *
24 * @param Page|null $page
25 */
26 function __construct(Page $page = null)
27 {
28 parent::__construct();
29 if ($page) {
30 $name = "Cheques";
31 $model = 'Gazin\Cheques\Model';
32 $class = new \ReflectionClass($model);
33 $constants = $class->getReflectionConstants();
34 $variables[$name] = [];
35
36 foreach ($constants as $constant) {
37 if (!$constant->isPublic())
38 continue;
39
40 $variables[$name][$constant->getName()] = $constant->getValue();
41 }
42
43 $page->addTag('script', 'Header', 'let metadata = ' . json_encode($this->queryChequeMeta()->select()));
44 $page->addTag('script', 'Header', 'let variables = ' . json_encode($variables));
45 }
46 }
47
48 /**
49 * Validação para as funções desse controller
50 *
51 * @param JsonTransaction $transaction
52 * @return void
53 */
54 protected function _validate(JsonTransaction $transaction)
55 {
56 //Garantir que a função esteja sendo chamada pela aplicação, e não externamente
57 $transaction->transactionSecurity();
58
59 //Exige acesso à listagem
60 $transaction->requireAdminPermission(ChequesCMS::MAIN);
61 }
62
63 /**
64 * Resgata a query filtrada para o Controller
65 *
66 * @param array $filters Filtros
67 *
68 * @return Icecream\Icecream
69 */
70 protected function _queryFilter($filters, $append = ['metadata', 'customer'], $order = [])
71 {
72 $query = $this->queryCheque($append);
73
74 // Filtros
75 // Filtrando pelo nome
76 if (!empty($filters['name']))
77 $query = $this->getCustomersByName(trim($filters['name']), $query);
78
79 // Filtrando pelo documento
80 if (!empty($filters['document'])) {
81
82 $cheques = $this->queryCheque()->columns(['id_customer as id_customer_cheque']);
83
84 $chequeMeta = $this->queryChequeMetaData()
85 ->leftJoin($cheques,'id','&&.id_cheque')
86 ->columns(["cheques_data.value as documento",'&&.id_cheque','id_customer_cheque'],'true')
87
88 ->where('cheques_data.id_meta',8);
89
90 $query->leftJoin($chequeMeta,'id_cheque','id');
91
92 $query->where('documento', $filters['document'])->groupBy('id_cheque');
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 // $customers = $this->_queryCustomer()
115 // ->columns(['&&.id'], true)
116 // ->search('customer.document', $filters['document']);
117
118 // $query->whereIn('&&.id_customer', $customers);
119 }
120 // Filtrando pelo status
121 if (!empty($filters['status']))
122 $query->whereIn('&&.status', $filters['status']);
123
124 if (!empty($filters['amount']))
125 $query->where('&&.amount', $this->currencyToNumber($filters['amount']));
126
127 //Filtrar por data
128 if (!empty($filters['date_from'])) {
129 //Normalizar data inicial
130 $dateFrom = $this->convertFromDate($filters['date_from']);
131
132 //Se a data final não foi enviada, utilizar hoje
133 $dateTo = !empty($filters['date_to']) ? $this->convertFromDate($filters['date_to']) : date('Y-m-d');
134
135 //Se for por data de inscrição
136 if ($filters['type_filter'] == 'subscribe') {
137 $query->whereBetween('DATE_FORMAT(&&.date_create, "%Y-%m-%d")', $dateFrom, $dateTo);
138 }
139
140 if ($filters['type_filter'] == 'emissao') {
141
142 $cheques = $this->queryCheque()->columns(['id_customer as id_customer_cheque']);
143
144 $chequeMeta = $this->queryChequeMetaData()
145 ->leftJoin($cheques,'id','&&.id_cheque')
146 ->columns(["STR_TO_DATE(cheques_data.value,'%d/%m/%Y') as data_emissao",'&&.id_cheque','id_customer_cheque'],'true')
147
148 ->where('cheques_data.id_meta',5);
149
150 $query->leftJoin($chequeMeta,'id_cheque','id');
151
152 $query->whereBetween('data_emissao', $dateFrom, $dateTo)->groupBy('id_cheque');
153 }
154
155 //Se for por data do status
156 else if ($filters['type_filter'] == 'status') {
157 //Verificar se um status foi selecionado
158 if (empty($filters['status']))
159 return new Fault('Selecione um status para o filtro', 'gazin_leads_status_not_selected');
160
161 //Buscar status que ocorreram na data selecionada
162 $history = $this->queryChequeHistory()
163 ->columns('&&.id_cheque', true)
164 ->whereNotEmpty('&&.id_cheque')
165 ->whereBetween('DATE_FORMAT(&&.date_create, "%Y-%m-%d")', $dateFrom, $dateTo)
166 ->whereIn('&&.status', $filters['status']);
167
168 //Buscar apenas esses leads
169 $query->whereIn('&&.id', $history);
170
171 //Zerar status para não ocorrer refiltragem
172 $filters['status'] = [];
173 }
174 }
175
176 // Filtrando pelo customer
177 if (!empty($filters['customer']))
178 $query->where('&&.id_customer', $filters['customer']);
179
180 if(!empty($order)) {
181 if($order[0] == 'data_emissão') {
182 $tableEmissao = $this->queryChequeMetaData()
183 ->where('cheques_data.id_meta', 5);
184
185 $query->leftJoin($tableEmissao, $tableEmissao->col('id_cheque'), '&&.id')
186 ->orderBy($tableEmissao->col('value'), $order[1]);
187 }
188 else
189 $query->orderBy($order[0], $order[1]);
190 }
191
192 return $query->whereNull('&&.date_delete');
193 }
194
195 /**
196 * Resgata a listagem de cheques
197 *
198 * @return array
199 */
200 public function list(Dynamic $dynamic, JsonTransaction $transaction)
201 {
202 $this->_validate($transaction);
203
204 $order = $dynamic->getOrder();
205
206 $params = $dynamic->getParams();
207 unset($params['order']);
208
209 $dynamic->setParams($params);
210
211 $source = $this->_queryFilter($dynamic->getFilters(), ['metadata', 'customer'], $order);
212
213 return $dynamic->getDynamic($source);
214 }
215
216 /**
217 * Listagem de totais (dashboard)
218 *
219 * @return array (Dynamic)
220 */
221 public function totals($data, JsonTransaction $transaction)
222 {
223 //Validar permissões
224 $this->_validate($transaction);
225
226 //Resgata tabela filtrada
227 $query = $this->_queryFilter($data);
228
229 return $this->totalsChequesSummary($query);
230 }
231
232 /**
233 * Exporta a listagem de cheques
234 *
235 * @return null (Binário)
236 */
237 public function export($data, JsonTransaction $transaction)
238 {
239 $transaction->requireAdminPermission(ChequesCMS::MAIN);
240
241 $result = $this->_queryFilter($data, ['metadata', 'customer'])
242 ->select();
243
244 $data = [];
245 $totals = [
246 "paid_amount" => 0,
247 'due_amount' => 0
248 ];
249
250 foreach ($result as $key => $cheque) {
251 $status = ChequesModel::status($cheque['status']);
252 // Recupera o customer
253 $customer = $cheque['customer'][0];
254
255 $data[$key] = [
256 'ID' => $cheque['id'],
257 'Nome' => $customer['name'],
258 'Documento' => $customer['document'],
259 'E-mail' => $customer['email'],
260 'Telefone' => $customer['phone'],
261 'Origem' => $cheque['source'],
262 'Valor' => $this->numberToCurrency($cheque['amount']),
263 'Status atual' => isset($status['title']) ? $status['title'] : '?',
264 'Último contato realizado' => empty($cheque['date_last_contact']) ? '-' : $this->convertToDateTime($cheque['date_last_contact']),
265 'Data do cadastro' => $this->convertToDateTime($cheque['date_create']),
266 ];
267
268
269 foreach ($cheque['metadata'] as $campo) {
270
271 $data[$key][$campo['title']] = $campo['value'];
272
273 }
274
275
276 if ($cheque['status'] == "PAY")
277 $totals["paid_amount"] += $cheque['amount'];
278 else
279 $totals["due_amount"] += $cheque['amount'];
280
281
282 }
283
284 $data[] = ['', '', '', '', '', '', '', '', '', '','','','','','','','','','','', 'Total Pago', 'Total Devido', 'Saldo'];
285 $data[] = [
286 '', '', '', '', '', '', '', '', '', '','','', '', '', '', '', '', '', '', '',
287 $this->numberToCurrency($totals['paid_amount']),
288 $this->numberToCurrency($totals["due_amount"]),
289 $this->numberToCurrency($totals['paid_amount'] - $totals["due_amount"])
290 ];
291
292 $titles = [
293 'ID',
294 'Nome' ,
295 'Documento' ,
296 'E-mail' ,
297 'Telefone' ,
298 'Origem' ,
299 'Valor',
300 'Status atual' ,
301 'Último contato realizado' ,
302 'Data do cadastro',
303 'Nome cliente final',
304 "Documento cliente final",
305 "Banco",
306 "Agência",
307 "Conta",
308 "Número do Cheque",
309 "Data de Emissão",
310 "Bom Para",
311 "Emitente",
312 "Documento do Emitente",
313
314 ];
315
316
317
318 $transaction->exportXLSX('Listagem de cheques ' . date('d-m-Y H.i.s'), $data, $titles);
319 }
320
321 /**
322 * Resgatar a listagem de status
323 *
324 * @return array
325 */
326 public function getStatusList($filterByScope = false)
327 {
328 $list = ChequesModel::status();
329
330 return $list;
331 }
332
333 public function getReturnReasonsList($filterByScope = false)
334 {
335 $list = ChequesModel::returnReason();
336
337 return $list;
338 }
339
340 /**
341 * Resgata a listagem das origens
342 *
343 * @return array
344 */
345 public function getSourcesList()
346 {
347 $list = ChequesModel::source();
348 return $list;
349 }
350
351 /**
352 * Resgata todos os dados de um cheque
353 *
354 * @return array
355 */
356 public function retrieve($data, JsonTransaction $transaction)
357 {
358 $this->_validate($transaction);
359
360 $cheque = $this->queryCheque(true)
361 ->where('&&.id', $data['id'])
362 ->selectFirst();
363
364 if (empty($cheque))
365 $transaction->outputError('Registro não encontrado!', 404);
366
367 return $cheque;
368 }
369
370 public $saveChequeContact_map = [
371 'status' => [
372 'name' => 'Status',
373 'mandatory' => true,
374 ],
375 'note' => [
376 'name' => 'Observação',
377 'replaceBefore' => 'removeHTML'
378 ]
379 ];
380
381 /**
382 * Salvar um contato realizado
383 *
384 * @return int|string
385 */
386 public function saveChequeContact($data, JsonTransaction $transaction)
387 {
388 $this->_validate($transaction);
389
390 $this->saveChequeContact_map['status']['inArray'] = array_keys(ChequesModel::status());
391
392 // Validando dados
393 $transaction->validateRequest($this->saveChequeContact_map, $data);
394
395 //Se foi enviado um arquivo, salvá-lo
396 if (!empty($data['file'])) {
397 $uploads = $this->saveUploadFiles($this->getPath(ChequesModel::HISTORY_FILES_FOLDER), $data['file'], false, true);
398
399 if ($uploads instanceof Fault)
400 return $uploads;
401
402 if (is_array($uploads)) {
403 for ($i = 0; $i < count($uploads); $i++)
404 $data['images'][] = [
405 "id_cheque" => null,
406 "file" => $uploads[$i]
407 ];
408 } else {
409 $data['images'][] = [
410 "id_cheque" => null,
411 "file" => $uploads
412 ];
413 }
414 }
415
416 return $this->saveContact($data);
417 }
418
419 public $save_map = [
420 'id_customer' => [
421 "name" => "Cliente",
422 'mandatory' => true
423 ],
424 "amount" => [
425 'name' => 'Valor',
426 'mandatory' => true
427 ],
428 "source" => [
429 "name" => "Origem",
430 "mandatory" => true
431 ]
432 ];
433
434 /**
435 * Salvar um cheque
436 *
437 * @return int|string
438 */
439 public function save($data, JsonTransaction $transaction)
440 {
441 // Validando segurança
442 $this->_validate($transaction);
443
444
445
446 // Validando dados principais
447 $transaction->validateRequest($this->save_map, $data);
448
449 if (!isset($data['metadata'][0])) {
450
451 $data['metadata'] = [];
452 }
453
454
455 // Validando metadados
456 foreach ($data['metadata'] as &$meta) {
457 if ($meta['required'] && empty($meta['value']))
458 return $transaction->outputError("O campo '" . $meta['title'] . "' é obrigatório!");
459 }
460
461 // Normalizando o amount
462 $data['amount'] = empty($data['amount']) ? 0 : $this->currencyToNumber($data['amount']);
463
464 //Se foi enviado um arquivo, salvá-lo
465 if (!empty($data['file'])) {
466
467 $uploads = $this->saveUploadFiles($this->getPath(ChequesModel::CHEQUE_FILES_FOLDER), $data['file'], false, true);
468
469 if ($uploads instanceof Fault)
470 return $uploads;
471
472 if (is_array($uploads))
473 for ($i = 0; $i < count($uploads); $i++)
474 $data['images'][] = [
475 "id_cheque" => null,
476 "file" => $uploads[$i]
477 ];
478 else
479 $data['images'][] = [
480 "id_cheque" => null,
481 "file" => $uploads
482 ];
483 }
484
485 return $this->saveCheque($data);
486 }
487
488 /**
489 * Remove um cheque
490 *
491 * @return null
492 */
493 public function remove($data, JsonTransaction $transaction)
494 {
495 $this->_validate($transaction);
496
497 return $this->removeCheque($data['id']);
498 }
499
500
501
502 public function migration_cheques(){
503
504 return $this->getMigration();
505 }
506}
507
You can see detailed error trace in the console.
render ()
/var/www/cobrancas.gazinsemijoias.com.br/index.php 19
parseMethod ()
/var/www/cobrancas.gazinsemijoias.com.br/Modules/Core/Navigation/Page.php 375
migration_cheques ()
/var/www/cobrancas.gazinsemijoias.com.br/Modules/Core/Utils/Util.php 144
You can see detailed error trace in the console.
main
System ready
'/var/www/cobrancas.gazinsemijoias.com.br'
web
Starting session
true
web
Starting web module
''
Navigation\Navigation
Setting Navigation default timezone
'America/Sao_Paulo'
Navigation\Navigation
Setting Navigation default language
false
web
User
'216.73.216.163'
Navigation\Navigation
Interpreting URI
'migration'