File: /var/www/vhost/disk-apps/demo.sports-crowd.com/app/Console/Commands/ErpSync.php
<?php
namespace App\Console\Commands;
use App\AcademyPurchase;
use App\AcademyTournamentPayment;
use App\Core\Payment\PaymentStatusEnum;
use App\Order;
use App\ErpParameter;
use App\Http\Controllers\AcademyPurchaseController;
use App\Http\Controllers\AcademyTournamentPaymentController;
use Illuminate\Console\Command;
use App\Http\Controllers\OrderController;
use App\Http\Controllers\ErpLogController;
use App\Http\Controllers\InventoryController;
use Carbon\Carbon;
class ErpSync extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'sportscrowd:erpSync';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Sincroniza los pedidos al ERP';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$origin = [];
$erpSync = ErpParameter::where('key', 'shop_sync')->first();
if ($erpSync && $erpSync->value == 'true') {
array_push($origin, 'shop');
array_push($origin, 'shopify');
}
$erpSync = ErpParameter::where('key', 'academy_sync')->first();
if ($erpSync && $erpSync->value == 'true') {
array_push($origin, 'academy_tournament');
array_push($origin, 'academy');
array_push($origin, 'shop_sportscrowd');
$inventoryController = new InventoryController;
$inventoryController->syncInventoryERP('012', 'academy', false, $this, 'AC017', null, null);
// Resincroniza los pedidos y pagos de academias que no se han sincronizado
// en los ultimos (X=30) dias
$this->resyncAcademyOrdersNotSynchronized(30);
$this->resyncAcademyPaymentsNotSynchronized(30);
}
$erpAutomaticLogSync = ErpParameter::where('key', 'automatic_sync_erp_log')->first();
if (count($origin) && $erpAutomaticLogSync->value == 'true') {
$controller = new ErpLogController();
$controller->syncPending($origin);
}
}
private function resyncAcademyOrdersNotSynchronized($days)
{
$pendingOrders = Order::select('orders.*')
->leftJoin('erp_logs', function ($join) {
$join->on('orders.id', '=', 'erp_logs.transaction_id')
->where('erp_logs.resolved', false)
->where('erp_logs.origin', 'shop_sportscrowd');
})
->where('store_type', 'academy')
->where('orders.creation_date', '>=', Carbon::now()->subDays($days))
->where('orders.gw_state', PaymentStatusEnum::CONFIRMED)
->where('orders.sync_with_erp', false)
->whereNull('erp_logs.id')
->get();
$orderController = new OrderController();
foreach ($pendingOrders as $order) {
$orderController->syncERP($order);
}
}
private function resyncAcademyPaymentsNotSynchronized($days)
{
$pendingPayments = AcademyPurchase::select('academy_purchases.*')
->join('payment_transactions', 'academy_purchases.payment_transaction_id', '=', 'payment_transactions.id')
->leftJoin('erp_logs', function ($join) {
$join->on('academy_purchases.id', '=', 'erp_logs.transaction_id')
->where('erp_logs.resolved', false)
->where('erp_logs.origin', 'academy');
})
->where('academy_purchases.created_at', '>=', Carbon::now()->subDays($days))
->where('payment_transactions.state', PaymentStatusEnum::CONFIRMED)
->where('academy_purchases.sync_with_erp', false)
->whereNull('erp_logs.id')
->get();
$controller = new AcademyPurchaseController();
foreach ($pendingPayments as $payment) {
$controller->syncERP($payment);
}
$pendingPayments = AcademyTournamentPayment::select('academy_tournament_payments.*')
->join('payment_transactions', 'academy_tournament_payments.payment_transaction_id', '=', 'payment_transactions.id')
->leftJoin('erp_logs', function ($join) {
$join->on('academy_tournament_payments.id', '=', 'erp_logs.transaction_id')
->where('erp_logs.resolved', false)
->where('erp_logs.origin', 'academy');
})
->where('academy_tournament_payments.created_at', '>=', Carbon::now()->subDays($days))
->where('payment_transactions.state', PaymentStatusEnum::CONFIRMED)
->where('academy_tournament_payments.sync_with_erp', false)
->whereNull('erp_logs.id')
->get();
$controller = new AcademyTournamentPaymentController();
foreach ($pendingPayments as $payment) {
$controller->syncERP($payment);
}
}
}