ultimatepos/app/Utils/BusinessUtil.php

476 lines
16 KiB
PHP

<?php
namespace App\Utils;
use App\Barcode;
use App\Business;
use App\BusinessLocation;
use App\Contact;
use App\Currency;
use App\InvoiceLayout;
use App\InvoiceScheme;
use App\NotificationTemplate;
use App\Printer;
use App\Unit;
use App\User;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
use App\System;
use App\VariationLocationDetails;
class BusinessUtil extends Util
{
/**
* Adds a default settings/resources for a new business
*
* @param int $business_id
* @param int $user_id
* @return bool
*/
public function newBusinessDefaultResources($business_id, $user_id)
{
$user = User::find($user_id);
//create Admin role and assign to user
$role = Role::create(['name' => 'Admin#'.$business_id,
'business_id' => $business_id,
'guard_name' => 'web', 'is_default' => 1,
]);
$user->assignRole($role->name);
//Create Cashier role for a new business
$cashier_role = Role::create(['name' => 'Cashier#'.$business_id,
'business_id' => $business_id,
'guard_name' => 'web',
]);
$cashier_role->syncPermissions(['sell.view', 'sell.create', 'sell.update', 'sell.delete', 'access_all_locations', 'view_cash_register', 'close_cash_register']);
$business = Business::findOrFail($business_id);
//Update reference count
$ref_count = $this->setAndGetReferenceCount('contacts', $business_id);
$contact_id = $this->generateReferenceNumber('contacts', $ref_count, $business_id);
//Add Default/Walk-In Customer for new business
$customer = [
'business_id' => $business_id,
'type' => 'customer',
'name' => __('contact.walk_in_customer'),
'created_by' => $user_id,
'is_default' => 1,
'contact_id' => $contact_id,
'credit_limit' => 0,
];
Contact::create($customer);
//create default invoice setting for new business
InvoiceScheme::create(['name' => 'Default',
'scheme_type' => 'blank',
'prefix' => '',
'start_number' => 1,
'total_digits' => 4,
'is_default' => 1,
'business_id' => $business_id,
]);
//create default invoice layour for new business
InvoiceLayout::create(['name' => 'Default',
'header_text' => null,
'invoice_no_prefix' => 'Invoice No.',
'invoice_heading' => 'Invoice',
'sub_total_label' => 'Subtotal',
'discount_label' => 'Discount',
'tax_label' => 'Tax',
'total_label' => 'Total',
'show_landmark' => 1,
'show_city' => 1,
'show_state' => 1,
'show_zip_code' => 1,
'show_country' => 1,
'highlight_color' => '#000000',
'footer_text' => '',
'is_default' => 1,
'business_id' => $business_id,
'invoice_heading_not_paid' => '',
'invoice_heading_paid' => '',
'total_due_label' => 'Total Due',
'paid_label' => 'Total Paid',
'show_payments' => 1,
'show_customer' => 1,
'customer_label' => 'Customer',
'table_product_label' => 'Product',
'table_qty_label' => 'Quantity',
'table_unit_price_label' => 'Unit Price',
'table_subtotal_label' => 'Subtotal',
'date_label' => 'Date',
]);
//create default barcode setting for new business
// Barcode::create(['name' => 'Default',
// 'description' => '',
// 'width' => 37.29,
// 'height' => 25.93,
// 'top_margin' => 5,
// 'left_margin' => 5,
// 'row_distance' => 1,
// 'col_distance' => 1,
// 'stickers_in_one_row' => 4,
// 'is_default' => 1,
// 'business_id' => $business_id
// ]);
//Add Default Unit for new business
$unit = [
'business_id' => $business_id,
'actual_name' => 'Pieces',
'short_name' => 'Pc(s)',
'allow_decimal' => 0,
'created_by' => $user_id,
];
Unit::create($unit);
//Create default notification templates
$notification_templates = NotificationTemplate::defaultNotificationTemplates($business_id);
foreach ($notification_templates as $notification_template) {
NotificationTemplate::create($notification_template);
}
return true;
}
/**
* Gives a list of all currencies
*
* @return array
*/
public function allCurrencies()
{
$currencies = Currency::select('id', DB::raw("concat(country, ' - ',currency, '(', code, ') ') as info"))
->orderBy('country')
->pluck('info', 'id');
return $currencies;
}
/**
* Gives a list of all timezone
*
* @return array
*/
public function allTimeZones()
{
$datetime = new \DateTimeZone('EDT');
$timezones = $datetime->listIdentifiers();
$timezone_list = [];
foreach ($timezones as $timezone) {
$timezone_list[$timezone] = $timezone;
}
return $timezone_list;
}
/**
* Gives a list of all accouting methods
*
* @return array
*/
public function allAccountingMethods()
{
return [
'fifo' => __('business.fifo'),
'lifo' => __('business.lifo'),
];
}
/**
* Default values for quick registration; details can be completed later in settings.
*/
public function getRegistrationDefaults()
{
$currency_id = null;
try {
$currency = System::getCurrency();
$currency_id = $currency->id ?? null;
} catch (\Exception $e) {
// use fallback below
}
if (empty($currency_id)) {
$currency_id = Currency::where('code', 'IRR')->value('id')
?? Currency::value('id');
}
return [
'currency_id' => $currency_id,
'time_zone' => config('app.timezone'),
'fy_start_month' => 1,
'accounting_method' => 'fifo',
'country' => 'ایران',
'state' => 'تهران',
'city' => 'تهران',
'zip_code' => '0000000',
'landmark' => null,
];
}
/**
* Creates new business with default settings.
*
* @return array
*/
public function createNewBusiness($business_details)
{
$business_details['sell_price_tax'] = 'includes';
$business_details['default_profit_percent'] = 25;
//Add POS shortcuts
$business_details['keyboard_shortcuts'] = '{"pos":{"express_checkout":"shift+e","pay_n_ckeckout":"shift+p","draft":"shift+d","cancel":"shift+c","edit_discount":"shift+i","edit_order_tax":"shift+t","add_payment_row":"shift+r","finalize_payment":"shift+f","recent_product_quantity":"f2","add_new_product":"f4"}}';
//Add prefixes
$business_details['ref_no_prefixes'] = [
'purchase' => 'PO',
'stock_transfer' => 'ST',
'stock_adjustment' => 'SA',
'sell_return' => 'CN',
'expense' => 'EP',
'contacts' => 'CO',
'purchase_payment' => 'PP',
'sell_payment' => 'SP',
'business_location' => 'BL',
];
//Disable inline tax editing
$business_details['enable_inline_tax'] = 0;
$business = Business::create_business($business_details);
return $business;
}
/**
* Gives details for a business
*
* @return object
*/
public function getDetails($business_id)
{
$details = Business::leftjoin('tax_rates AS TR', 'business.default_sales_tax', 'TR.id')
->leftjoin('currencies AS cur', 'business.currency_id', 'cur.id')
->select(
'business.*',
'cur.code as currency_code',
'cur.symbol as currency_symbol',
'thousand_separator',
'decimal_separator',
'TR.amount AS tax_calculation_amount',
'business.default_sales_discount'
)
->where('business.id', $business_id)
->first();
return $details;
}
/**
* Gives current financial year
*
* @return array
*/
public function getCurrentFinancialYear($business_id)
{
$business = Business::where('id', $business_id)->first();
$start_month = $business->fy_start_month;
$end_month = $start_month - 1;
if ($start_month == 1) {
$end_month = 12;
}
$start_year = date('Y');
//if current month is less than start month change start year to last year
if (date('n') < $start_month) {
$start_year = $start_year - 1;
}
$end_year = date('Y');
//if current month is greater than end month change end year to next year
if (date('n') > $end_month) {
$end_year = $start_year + 1;
}
$start_date = $start_year.'-'.str_pad($start_month, 2, 0, STR_PAD_LEFT).'-01';
$end_date = $end_year.'-'.str_pad($end_month, 2, 0, STR_PAD_LEFT).'-01';
$end_date = date('Y-m-t', strtotime($end_date));
$output = [
'start' => $start_date,
'end' => $end_date,
];
return $output;
}
/**
* Adds a new location to a business
*
* @param int $business_id
* @param array $location_details
* @param int $invoice_layout_id default null
* @return location object
*/
public function addLocation($business_id, $location_details, $invoice_scheme_id = null, $invoice_layout_id = null)
{
if (empty($invoice_scheme_id)) {
$layout = InvoiceLayout::where('is_default', 1)
->where('business_id', $business_id)
->first();
$invoice_layout_id = $layout->id;
}
if (empty($invoice_scheme_id)) {
$scheme = InvoiceScheme::where('is_default', 1)
->where('business_id', $business_id)
->first();
$invoice_scheme_id = $scheme->id;
}
//Update reference count
$ref_count = $this->setAndGetReferenceCount('business_location', $business_id);
$location_id = $this->generateReferenceNumber('business_location', $ref_count, $business_id);
//Enable all payment methods by default
$payment_types = $this->payment_types();
$location_payment_types = [];
foreach ($payment_types as $key => $value) {
$location_payment_types[$key] = [
'is_enabled' => 1,
'account' => null,
];
}
$location = BusinessLocation::create(['business_id' => $business_id,
'name' => $location_details['name'],
'landmark' => $location_details['landmark'],
'city' => $location_details['city'],
'state' => $location_details['state'],
'zip_code' => $location_details['zip_code'],
'country' => $location_details['country'],
'invoice_scheme_id' => $invoice_scheme_id,
'invoice_layout_id' => $invoice_layout_id,
'sale_invoice_layout_id' => $invoice_layout_id,
'mobile' => ! empty($location_details['mobile']) ? $location_details['mobile'] : '',
'alternate_number' => ! empty($location_details['alternate_number']) ? $location_details['alternate_number'] : '',
'website' => ! empty($location_details['website']) ? $location_details['website'] : '',
'email' => '',
'location_id' => $location_id,
'default_payment_accounts' => json_encode($location_payment_types),
]);
return $location;
}
/**
* Return the invoice layout details
*
* @param int $business_id
* @param array $layout_id = null
* @return location object
*/
public function invoiceLayout($business_id, $layout_id = null)
{
$layout = null;
if (! empty($layout_id)) {
$layout = InvoiceLayout::find($layout_id);
}
//If layout is not found (deleted) then get the default layout for the business
if (empty($layout)) {
$layout = InvoiceLayout::where('business_id', $business_id)
->where('is_default', 1)
->first();
}
//$output = []
return $layout;
}
/**
* Return the printer configuration
*
* @param int $business_id
* @param int $printer_id
* @return array
*/
public function printerConfig($business_id, $printer_id)
{
$printer = Printer::where('business_id', $business_id)
->find($printer_id);
$output = [];
if (! empty($printer)) {
$output['connection_type'] = $printer->connection_type;
$output['capability_profile'] = $printer->capability_profile;
$output['char_per_line'] = $printer->char_per_line;
$output['ip_address'] = $printer->ip_address;
$output['port'] = $printer->port;
$output['path'] = $printer->path;
$output['server_url'] = $printer->server_url;
}
return $output;
}
/**
* Return the date range for which editing of transaction for a business is allowed.
*
* @param int $business_id
* @param char $edit_transaction_period
* @return array
*/
public function editTransactionDateRange($business_id, $edit_transaction_period)
{
if (is_numeric($edit_transaction_period)) {
return ['start' => \Carbon::today()
->subDays($edit_transaction_period),
'end' => \Carbon::today(),
];
} elseif ($edit_transaction_period == 'fy') {
//Editing allowed for current financial year
return $this->getCurrentFinancialYear($business_id);
}
return false;
}
/**
* Return the default setting for the pos screen.
*
* @return array
*/
public function defaultPosSettings()
{
return ['disable_pay_checkout' => 0, 'disable_draft' => 0, 'disable_express_checkout' => 0, 'hide_product_suggestion' => 0, 'hide_recent_trans' => 0, 'disable_discount' => 0, 'disable_order_tax' => 0, 'is_pos_subtotal_editable' => 0];
}
/**
* Return the default setting for the email.
*
* @return array
*/
public function defaultEmailSettings()
{
return ['mail_host' => '', 'mail_port' => '', 'mail_username' => '', 'mail_password' => '', 'mail_encryption' => '', 'mail_from_address' => '', 'mail_from_name' => ''];
}
/**
* Return the default setting for the email.
*
* @return array
*/
public function defaultSmsSettings()
{
return ['url' => '', 'send_to_param_name' => 'to', 'msg_param_name' => 'text', 'request_method' => 'post', 'param_1' => '', 'param_val_1' => '', 'param_2' => '', 'param_val_2' => '', 'param_3' => '', 'param_val_3' => '', 'param_4' => '', 'param_val_4' => '', 'param_5' => '', 'param_val_5' => '', 'data_parameter_type' => 'form-data'];
}
}