ultimatepos/app/Utils/ContactUtil.php

265 lines
11 KiB
PHP

<?php
namespace App\Utils;
use App\Contact;
use App\Transaction;
use DB;
class ContactUtil extends Util
{
/**
* Returns Walk In Customer for a Business
*
* @param int $business_id
* @return array/false
*/
public function getWalkInCustomer($business_id, $array = true)
{
$contact = Contact::whereIn('type', ['customer', 'both'])
->where('contacts.business_id', $business_id)
->where('contacts.is_default', 1)
->leftjoin('customer_groups as cg', 'cg.id', '=', 'contacts.customer_group_id')
->select('contacts.*',
'cg.amount as discount_percent',
'cg.price_calculation_type',
'cg.selling_price_group_id'
)
->first();
if (! empty($contact)) {
$contact->contact_address = $contact->contact_address;
$output = $array ? $contact->toArray() : $contact;
return $output;
} else {
return null;
}
}
/**
* Returns the customer group
*
* @param int $business_id
* @param int $customer_id
* @return array
*/
public function getCustomerGroup($business_id, $customer_id)
{
$cg = [];
if (empty($customer_id)) {
return $cg;
}
$contact = Contact::leftjoin('customer_groups as CG', 'contacts.customer_group_id', 'CG.id')
->where('contacts.id', $customer_id)
->where('contacts.business_id', $business_id)
->select('CG.*')
->first();
return $contact;
}
/**
* Returns the contact info
*
* @param int $business_id
* @param int $contact_id
* @return array
*/
public function getContactInfo($business_id, $contact_id)
{
$contact = Contact::where('contacts.id', $contact_id)
->where('contacts.business_id', $business_id)
->leftjoin('transactions AS t', 'contacts.id', '=', 't.contact_id')
->with(['business'])
->select(
DB::raw("SUM(IF(t.type = 'purchase', final_total, 0)) as total_purchase"),
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', final_total, 0)) as total_invoice"),
DB::raw("SUM(IF(t.type = 'purchase', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as purchase_paid"),
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', (SELECT SUM(IF(is_return = 1,-1*amount,amount)) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as invoice_received"),
DB::raw("SUM(IF(t.type = 'opening_balance', final_total, 0)) as opening_balance"),
DB::raw("SUM(IF(t.type = 'opening_balance', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as opening_balance_paid"),
'contacts.*'
)->first();
return $contact;
}
public function createNewContact($input)
{
//Check Contact id
$count = 0;
if (! empty($input['contact_id'])) {
$count = Contact::where('business_id', $input['business_id'])
->where('contact_id', $input['contact_id'])
->count();
}
if ($count == 0) {
//Update reference count
$ref_count = $this->setAndGetReferenceCount('contacts', $input['business_id']);
if (empty($input['contact_id'])) {
//Generate reference number
$input['contact_id'] = $this->generateReferenceNumber('contacts', $ref_count, $input['business_id']);
}
$opening_balance = isset($input['opening_balance']) ? $input['opening_balance'] : 0;
if (isset($input['opening_balance'])) {
unset($input['opening_balance']);
}
//Assigned the user
$assigned_to_users = [];
if (! empty($input['assigned_to_users'])) {
$assigned_to_users = $input['assigned_to_users'];
unset($input['assigned_to_users']);
}
$contact = Contact::create($input);
//Assigned the user
if (! empty($assigned_to_users)) {
$contact->userHavingAccess()->sync($assigned_to_users);
}
//Add opening balance
if (! empty($opening_balance)) {
$transactionUtil = new TransactionUtil();
$transactionUtil->createOpeningBalanceTransaction($contact->business_id, $contact->id, $opening_balance, $contact->created_by, false);
}
$output = ['success' => true,
'data' => $contact,
'msg' => __('contact.added_success'),
];
return $output;
} else {
throw new \Exception('Error Processing Request', 1);
}
}
public function updateContact($input, $id, $business_id)
{
$count = 0;
//Check Contact id
if (! empty($input['contact_id'])) {
$count = Contact::where('business_id', $business_id)
->where('contact_id', $input['contact_id'])
->where('id', '!=', $id)
->count();
}
if ($count == 0) {
//Get opening balance if exists
$ob_transaction = Transaction::where('contact_id', $id)
->where('type', 'opening_balance')
->first();
$opening_balance = isset($input['opening_balance']) ? $input['opening_balance'] : 0;
if (isset($input['opening_balance'])) {
unset($input['opening_balance']);
}
//Assigned the user
$assigned_to_users = [];
if (! empty($input['assigned_to_users'])) {
$assigned_to_users = $input['assigned_to_users'];
unset($input['assigned_to_users']);
}
$contact = Contact::where('business_id', $business_id)->findOrFail($id);
foreach ($input as $key => $value) {
$contact->$key = $value;
}
$contact->save();
//Assigned the user
if (! empty($assigned_to_users)) {
$contact->userHavingAccess()->sync($assigned_to_users);
}
//Opening balance update
$transactionUtil = new TransactionUtil();
if (! empty($ob_transaction)) {
$opening_balance_paid = $transactionUtil->getTotalAmountPaid($ob_transaction->id);
if (! empty($opening_balance_paid)) {
$opening_balance += $opening_balance_paid;
}
$ob_transaction->final_total = $opening_balance;
$ob_transaction->save();
//Update opening balance payment status
$transactionUtil->updatePaymentStatus($ob_transaction->id, $ob_transaction->final_total);
} else {
//Add opening balance
if (! empty($opening_balance)) {
$transactionUtil->createOpeningBalanceTransaction($business_id, $contact->id, $opening_balance, $contact->created_by, false);
}
}
$output = ['success' => true,
'msg' => __('contact.updated_success'),
'data' => $contact,
];
} else {
throw new \Exception('Error Processing Request', 1);
}
return $output;
}
public function getContactQuery($business_id, $type, $contact_ids = [])
{
$query = Contact::leftjoin('transactions AS t', 'contacts.id', '=', 't.contact_id')
->leftjoin('customer_groups AS cg', 'contacts.customer_group_id', '=', 'cg.id')
->where('contacts.business_id', $business_id);
if ($type == 'supplier') {
$query->onlySuppliers();
} elseif ($type == 'customer') {
$query->onlyCustomers();
} else {
if (auth()->check() && ((! auth()->user()->can('customer.view') && auth()->user()->can('customer.view_own'))) || (! auth()->user()->can('supplier.view') && auth()->user()->can('supplier.view_own'))) {
$query->onlyOwnContact();
}
}
if (! empty($contact_ids)) {
$query->whereIn('contacts.id', $contact_ids);
}
$query->select([
'contacts.*',
'cg.name as customer_group',
DB::raw("SUM(IF(t.type = 'opening_balance', final_total, 0)) as opening_balance"),
DB::raw("SUM(IF(t.type = 'opening_balance', (SELECT SUM(IF(is_return = 1,-1*amount,amount)) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as opening_balance_paid"),
DB::raw('MAX(DATE(transaction_date)) as max_transaction_date'),
DB::raw("SUM(IF(t.type = 'ledger_discount', final_total, 0)) as total_ledger_discount"),
't.transaction_date',
]);
if (in_array($type, ['supplier', 'both'])) {
$query->addSelect([
DB::raw("SUM(IF(t.type = 'purchase', final_total, 0)) as total_purchase"),
DB::raw("SUM(IF(t.type = 'purchase', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as purchase_paid"),
DB::raw("SUM(IF(t.type = 'purchase_return', final_total, 0)) as total_purchase_return"),
DB::raw("SUM(IF(t.type = 'purchase_return', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as purchase_return_paid"),
]);
}
if (in_array($type, ['customer', 'both'])) {
$query->addSelect([
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', final_total, 0)) as total_invoice"),
DB::raw("SUM(IF(t.type = 'sell' AND t.status = 'final', (SELECT SUM(IF(is_return = 1,-1*amount,amount)) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as invoice_received"),
DB::raw("SUM(IF(t.type = 'sell_return', final_total, 0)) as total_sell_return"),
DB::raw("SUM(IF(t.type = 'sell_return', (SELECT SUM(amount) FROM transaction_payments WHERE transaction_payments.transaction_id=t.id), 0)) as sell_return_paid"),
]);
}
$query->groupBy('contacts.id');
return $query;
}
}