migrate to gtea from bistbucket
This commit is contained in:
215
app/Services/PartyLedgerService.php
Normal file
215
app/Services/PartyLedgerService.php
Normal file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use App\Models\Sale;
|
||||
use App\Models\Party;
|
||||
use App\Models\Purchase;
|
||||
use App\Models\DueCollect;
|
||||
use App\Models\Transaction;
|
||||
|
||||
class PartyLedgerService
|
||||
{
|
||||
public function list($request, $partyId)
|
||||
{
|
||||
$businessId = auth()->user()->business_id;
|
||||
|
||||
$party = Party::where('business_id', $businessId)->findOrFail($partyId);
|
||||
$isCustomer = in_array($party->type, ['Retailer', 'Dealer', 'Wholesaler']);
|
||||
|
||||
/* ================= DATE FILTER ================= */
|
||||
$fromDate = null;
|
||||
$toDate = null;
|
||||
|
||||
if ($request->filled('duration')) {
|
||||
switch ($request->duration) {
|
||||
case 'today':
|
||||
$fromDate = Carbon::today()->startOfDay();
|
||||
$toDate = Carbon::today()->endOfDay();
|
||||
break;
|
||||
case 'yesterday':
|
||||
$fromDate = Carbon::yesterday()->startOfDay();
|
||||
$toDate = Carbon::yesterday()->endOfDay();
|
||||
break;
|
||||
case 'last_seven_days':
|
||||
$fromDate = Carbon::now()->subDays(7);
|
||||
break;
|
||||
case 'last_thirty_days':
|
||||
$fromDate = Carbon::now()->subDays(30);
|
||||
break;
|
||||
case 'current_month':
|
||||
$fromDate = Carbon::now()->startOfMonth();
|
||||
break;
|
||||
case 'last_month':
|
||||
$fromDate = Carbon::now()->subMonth()->startOfMonth();
|
||||
$toDate = Carbon::now()->subMonth()->endOfMonth();
|
||||
break;
|
||||
case 'current_year':
|
||||
$fromDate = Carbon::now()->startOfYear();
|
||||
break;
|
||||
case 'custom_date':
|
||||
$fromDate = Carbon::parse($request->from_date);
|
||||
$toDate = Carbon::parse($request->to_date);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$events = collect();
|
||||
$ledger = collect();
|
||||
|
||||
/* ================= OPENING BALANCE ================= */
|
||||
if (!$fromDate || $party->created_at > $fromDate) {
|
||||
$opening = 0;
|
||||
|
||||
if ($isCustomer) {
|
||||
$opening = $party->opening_balance_type === 'advance'
|
||||
? -$party->opening_balance
|
||||
: $party->opening_balance;
|
||||
} else {
|
||||
$opening = $party->opening_balance_type === 'advance'
|
||||
? $party->opening_balance
|
||||
: -$party->opening_balance;
|
||||
}
|
||||
|
||||
$debit_amount = $opening > 0 ? $opening : 0;
|
||||
$credit_amount = $opening < 0 ? abs($opening) : 0;
|
||||
$condition = in_array($party->branch_id, [auth()->user()->branch_id, auth()->user()->active_branch_id]) || !$party->branch_id || auth()->user()->accessToMultiBranch();
|
||||
|
||||
$events->push([
|
||||
'id' => null,
|
||||
'date' => $party->created_at,
|
||||
'invoice_no' => null,
|
||||
'platform' => 'Opening',
|
||||
'debit_amount' => $condition ? $debit_amount : 0,
|
||||
'credit_amount' => $condition ? $credit_amount : 0,
|
||||
'balance' => 0,
|
||||
'created_at' => $party->created_at,
|
||||
]);
|
||||
}
|
||||
|
||||
/* ================= CUSTOMER ================= */
|
||||
if ($isCustomer) {
|
||||
|
||||
$sales = Sale::where('business_id', $businessId)
|
||||
->where('party_id', $partyId)
|
||||
->get();
|
||||
|
||||
$saleIds = $sales->pluck('id');
|
||||
|
||||
$salePayments = Transaction::where('business_id', $businessId)
|
||||
->where('platform', 'sale')
|
||||
->whereIn('reference_id', $saleIds)
|
||||
->where('transaction_type', '!=', 'wallet_payment')
|
||||
->selectRaw('reference_id, SUM(amount) as paid')
|
||||
->groupBy('reference_id')
|
||||
->pluck('paid', 'reference_id');
|
||||
|
||||
foreach ($sales as $sale) {
|
||||
$events->push([
|
||||
'id' => $sale->id,
|
||||
'date' => Carbon::parse($sale->saleDate),
|
||||
'invoice_no' => $sale->invoiceNumber,
|
||||
'platform' => 'Sales',
|
||||
'debit_amount' => $sale->actual_total_amount,
|
||||
'credit_amount' => $salePayments[$sale->id] ?? 0,
|
||||
'balance' => 0,
|
||||
'created_at' => $sale->created_at,
|
||||
]);
|
||||
}
|
||||
|
||||
$dueCollects = DueCollect::where('business_id', $businessId)
|
||||
->where('party_id', $partyId)
|
||||
->get();
|
||||
|
||||
foreach ($dueCollects as $due) {
|
||||
$events->push([
|
||||
'id' => $partyId,
|
||||
'date' => Carbon::parse($due->paymentDate),
|
||||
'invoice_no' => $due->invoiceNumber,
|
||||
'platform' => 'Payment',
|
||||
'debit_amount' => 0,
|
||||
'credit_amount' => $due->payDueAmount,
|
||||
'balance' => 0,
|
||||
'created_at' => $due->created_at,
|
||||
]);
|
||||
}
|
||||
|
||||
/* ================= SUPPLIER ================= */
|
||||
} else {
|
||||
|
||||
$purchases = Purchase::where('business_id', $businessId)
|
||||
->where('party_id', $partyId)
|
||||
->get();
|
||||
|
||||
$purchaseIds = $purchases->pluck('id');
|
||||
|
||||
$purchasePayments = Transaction::where('business_id', $businessId)
|
||||
->where('platform', 'purchase')
|
||||
->whereIn('reference_id', $purchaseIds)
|
||||
->where('transaction_type', '!=', 'wallet_payment')
|
||||
->selectRaw('reference_id, SUM(amount) as paid')
|
||||
->groupBy('reference_id')
|
||||
->pluck('paid', 'reference_id');
|
||||
|
||||
foreach ($purchases as $purchase) {
|
||||
$events->push([
|
||||
'id' => $purchase->id,
|
||||
'date' => Carbon::parse($purchase->purchaseDate),
|
||||
'invoice_no' => $purchase->invoiceNumber,
|
||||
'platform' => 'Purchase',
|
||||
'debit_amount' => $purchasePayments[$purchase->id] ?? 0,
|
||||
'credit_amount' => $purchase->totalAmount,
|
||||
'balance' => 0,
|
||||
'created_at' => $purchase->created_at,
|
||||
]);
|
||||
}
|
||||
|
||||
$dueCollects = DueCollect::where('business_id', $businessId)
|
||||
->where('party_id', $partyId)
|
||||
->get();
|
||||
|
||||
foreach ($dueCollects as $due) {
|
||||
$events->push([
|
||||
'id' => $partyId,
|
||||
'date' => Carbon::parse($due->paymentDate),
|
||||
'invoice_no' => $due->invoiceNumber,
|
||||
'platform' => 'Payment',
|
||||
'debit_amount' => $due->payDueAmount,
|
||||
'credit_amount' => 0,
|
||||
'balance' => 0,
|
||||
'created_at' => $due->created_at,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ================= SORT ================= */
|
||||
$events = $events->sortBy(fn ($e) => [
|
||||
$e['created_at'] ? $e['created_at']->timestamp : 0
|
||||
])->values();
|
||||
|
||||
/* ================= FILTER + BALANCE ================= */
|
||||
$runningBalance = 0;
|
||||
|
||||
foreach ($events as $e) {
|
||||
|
||||
if ($fromDate && $e['date'] && $e['date']->lt($fromDate)) continue;
|
||||
if ($toDate && $e['date'] && $e['date']->gt($toDate)) continue;
|
||||
|
||||
$runningBalance += $e['debit_amount'];
|
||||
$runningBalance -= $e['credit_amount'];
|
||||
|
||||
$ledger->push([
|
||||
'id' => $e['id'],
|
||||
'date' => $e['date'],
|
||||
'invoice_no' => $e['invoice_no'],
|
||||
'platform' => $e['platform'],
|
||||
'debit_amount' => $e['debit_amount'],
|
||||
'credit_amount' => $e['credit_amount'],
|
||||
'balance' => $runningBalance,
|
||||
]);
|
||||
}
|
||||
|
||||
return $ledger->values();
|
||||
}
|
||||
}
|
||||
46
app/Services/PdfService.php
Normal file
46
app/Services/PdfService.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Mpdf\Mpdf;
|
||||
use Mpdf\Config\ConfigVariables;
|
||||
use Mpdf\Config\FontVariables;
|
||||
|
||||
class PdfService
|
||||
{
|
||||
public static function render(string $view, array $data, string $filename)
|
||||
{
|
||||
$defaultConfig = (new ConfigVariables())->getDefaults();
|
||||
$fontDirs = $defaultConfig['fontDir'];
|
||||
|
||||
$defaultFontConfig = (new FontVariables())->getDefaults();
|
||||
$fontData = $defaultFontConfig['fontdata'];
|
||||
|
||||
$mpdf = new Mpdf([
|
||||
'mode' => 'utf-8',
|
||||
'format' => 'A4',
|
||||
'fontDir' => array_merge($fontDirs, [
|
||||
public_path('fonts'),
|
||||
]),
|
||||
'fontdata' => $fontData + [
|
||||
'notosans' => ['R' => 'NotoSans-Regular.ttf'],
|
||||
'notosansbengali' => ['R' => 'NotoSansBengali-Regular.ttf'],
|
||||
'notonaskharabic' => ['R' => 'NotoNaskhArabic-Regular.ttf'],
|
||||
'notosansdevanagari' => ['R' => 'NotoSansDevanagari-Regular.ttf'],
|
||||
'notosanssc' => ['R' => 'NotoSansSC-Regular.ttf'],
|
||||
'notosansjp' => ['R' => 'NotoSansJP-Regular.ttf'],
|
||||
'notosanskr' => ['R' => 'NotoSansKR-Regular.ttf'],
|
||||
],
|
||||
'default_font' => 'notosans',
|
||||
'autoScriptToLang' => true,
|
||||
'autoLangToFont' => true,
|
||||
]);
|
||||
|
||||
$html = view($view, $data)->render();
|
||||
$mpdf->WriteHTML($html);
|
||||
|
||||
return response($mpdf->Output($filename, 'S'))
|
||||
->header('Content-Type', 'application/pdf')
|
||||
->header('Content-Disposition', 'inline; filename="'.$filename.'"');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user