fix(tahesab): do not 500 pending-summary when tahesab table is missing
Gholaktala has no local tahesab table; count queries now return empty pending stats instead of QueryException. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -8,6 +8,7 @@ use Carbon\Carbon;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
use App\Models\Tahesab;
|
use App\Models\Tahesab;
|
||||||
use App\Models\Customer;
|
use App\Models\Customer;
|
||||||
use App\Services\AccountingProductDocMapper;
|
use App\Services\AccountingProductDocMapper;
|
||||||
@@ -44,6 +45,10 @@ class TahesabController extends Controller
|
|||||||
|
|
||||||
public function table(Request $request)
|
public function table(Request $request)
|
||||||
{
|
{
|
||||||
|
if (! Schema::hasTable('tahesab')) {
|
||||||
|
return response()->json([]);
|
||||||
|
}
|
||||||
|
|
||||||
$view = (string) $request->input('view', 'all');
|
$view = (string) $request->input('view', 'all');
|
||||||
$query = Tahesab::with('customer')->orderByDesc('id');
|
$query = Tahesab::with('customer')->orderByDesc('id');
|
||||||
|
|
||||||
|
|||||||
@@ -218,10 +218,14 @@ class TahesabSyncService
|
|||||||
/**
|
/**
|
||||||
* خلاصهٔ سندهای جاافتاده / ناموفق برای بنر ادمین.
|
* خلاصهٔ سندهای جاافتاده / ناموفق برای بنر ادمین.
|
||||||
*
|
*
|
||||||
* @return array{failed_rows:int,missing_withdraws:int,missing_orders:int,total:int}
|
* @return array{failed_rows:int,missing_withdraws:int,missing_orders:int,total:int,doc_sync:array}
|
||||||
*/
|
*/
|
||||||
public function pendingSummary(?int $customerId = null): array
|
public function pendingSummary(?int $customerId = null): array
|
||||||
{
|
{
|
||||||
|
if (! Schema::hasTable('tahesab')) {
|
||||||
|
return $this->emptyPendingPayload();
|
||||||
|
}
|
||||||
|
|
||||||
$failedRows = (int) $this->unsyncedRowsQuery()
|
$failedRows = (int) $this->unsyncedRowsQuery()
|
||||||
->when($customerId, fn ($q) => $q->where('customer_id', $customerId))
|
->when($customerId, fn ($q) => $q->where('customer_id', $customerId))
|
||||||
->count();
|
->count();
|
||||||
@@ -244,6 +248,13 @@ class TahesabSyncService
|
|||||||
*/
|
*/
|
||||||
public function pendingTotals(?int $customerId = null): array
|
public function pendingTotals(?int $customerId = null): array
|
||||||
{
|
{
|
||||||
|
if (! Schema::hasTable('tahesab')) {
|
||||||
|
$empty = $this->emptyPendingPayload();
|
||||||
|
unset($empty['doc_sync']);
|
||||||
|
|
||||||
|
return $empty;
|
||||||
|
}
|
||||||
|
|
||||||
$failedRows = (int) $this->unsyncedRowsQuery()
|
$failedRows = (int) $this->unsyncedRowsQuery()
|
||||||
->when($customerId, fn ($q) => $q->where('customer_id', $customerId))
|
->when($customerId, fn ($q) => $q->where('customer_id', $customerId))
|
||||||
->count();
|
->count();
|
||||||
@@ -264,6 +275,10 @@ class TahesabSyncService
|
|||||||
*/
|
*/
|
||||||
public function peekNextPending(array $skip = []): ?array
|
public function peekNextPending(array $skip = []): ?array
|
||||||
{
|
{
|
||||||
|
if (! Schema::hasTable('tahesab')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$skipRow = array_values(array_filter($skip['row'] ?? []));
|
$skipRow = array_values(array_filter($skip['row'] ?? []));
|
||||||
$row = $this->unsyncedRowsQuery()
|
$row = $this->unsyncedRowsQuery()
|
||||||
->when($skipRow !== [], fn ($q) => $q->whereNotIn('id', $skipRow))
|
->when($skipRow !== [], fn ($q) => $q->whereNotIn('id', $skipRow))
|
||||||
@@ -309,6 +324,10 @@ class TahesabSyncService
|
|||||||
*/
|
*/
|
||||||
public function pendingDocs(?int $customerId = null, int $limit = 200): array
|
public function pendingDocs(?int $customerId = null, int $limit = 200): array
|
||||||
{
|
{
|
||||||
|
if (! Schema::hasTable('tahesab')) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
$limit = max(1, min(500, $limit));
|
$limit = max(1, min(500, $limit));
|
||||||
$rows = [];
|
$rows = [];
|
||||||
|
|
||||||
@@ -556,7 +575,7 @@ class TahesabSyncService
|
|||||||
|
|
||||||
private function missingWithdrawQuery(?int $customerId = null, array $exclude = [])
|
private function missingWithdrawQuery(?int $customerId = null, array $exclude = [])
|
||||||
{
|
{
|
||||||
if (! Schema::hasTable('withdraws')) {
|
if (! Schema::hasTable('withdraws') || ! Schema::hasTable('tahesab')) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -601,7 +620,7 @@ class TahesabSyncService
|
|||||||
|
|
||||||
private function missingOrderQuery(?int $customerId = null, array $exclude = [])
|
private function missingOrderQuery(?int $customerId = null, array $exclude = [])
|
||||||
{
|
{
|
||||||
if (! Schema::hasTable('orders')) {
|
if (! Schema::hasTable('orders') || ! Schema::hasTable('tahesab')) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -686,6 +705,17 @@ class TahesabSyncService
|
|||||||
return $result !== false;
|
return $result !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function emptyPendingPayload(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'failed_rows' => 0,
|
||||||
|
'missing_withdraws' => 0,
|
||||||
|
'missing_orders' => 0,
|
||||||
|
'total' => 0,
|
||||||
|
'doc_sync' => app(TahesabDocSyncService::class)->snapshot(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
private function hasSyncColumns(): bool
|
private function hasSyncColumns(): bool
|
||||||
{
|
{
|
||||||
return Schema::hasTable('tahesab') && Schema::hasColumn('tahesab', 'sync_status');
|
return Schema::hasTable('tahesab') && Schema::hasColumn('tahesab', 'sync_status');
|
||||||
|
|||||||
Reference in New Issue
Block a user