228 lines
7.6 KiB
PHP
228 lines
7.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Barobill;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Barobill\BarobillMember;
|
|
use App\Models\Finance\TradingPartner;
|
|
use App\Models\Tenants\Tenant;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\View\View;
|
|
|
|
/**
|
|
* 바로빌 컨트롤러
|
|
*/
|
|
class BarobillController extends Controller
|
|
{
|
|
/**
|
|
* 바로빌 개발문서 페이지
|
|
*/
|
|
public function devGuide(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.dev-guide.index'));
|
|
}
|
|
|
|
return view('barobill.dev-guide');
|
|
}
|
|
|
|
/**
|
|
* 바로빌 설정 페이지
|
|
* HTMX 요청 시 전체 페이지 리로드 (스크립트 로딩을 위해)
|
|
*/
|
|
public function config(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.config.index'));
|
|
}
|
|
|
|
// 현재 선택된 테넌트 정보
|
|
$tenantId = session('selected_tenant_id');
|
|
$currentTenant = $tenantId ? Tenant::find($tenantId) : null;
|
|
|
|
// 해당 테넌트의 바로빌 회원사 정보
|
|
$barobillMember = $tenantId
|
|
? BarobillMember::where('tenant_id', $tenantId)->first()
|
|
: null;
|
|
|
|
return view('barobill.config.index', compact('currentTenant', 'barobillMember'));
|
|
}
|
|
|
|
/**
|
|
* 회원사관리 페이지
|
|
* HTMX 요청 시 전체 페이지 리로드 (스크립트 로딩을 위해)
|
|
*/
|
|
public function members(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.members.index'));
|
|
}
|
|
|
|
// 테넌트 목록 (전체 테넌트 모드에서 선택용)
|
|
$tenants = Tenant::select('id', 'company_name')->orderBy('company_name')->get();
|
|
|
|
return view('barobill.members.index', compact('tenants'));
|
|
}
|
|
|
|
/**
|
|
* 바로빌 설정 페이지 (이메일 주소 및 기타 자료 수정/동기화)
|
|
*/
|
|
public function settings(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.settings.index'));
|
|
}
|
|
|
|
// 현재 선택된 테넌트 정보
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$currentTenant = Tenant::find($tenantId);
|
|
|
|
// 해당 테넌트의 바로빌 회원사 정보
|
|
$barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
|
|
|
|
// 서버 모드 판별
|
|
$isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;
|
|
|
|
// 바로빌 로그인 정보 등록 여부
|
|
$hasBarobillLogin = false;
|
|
if ($barobillMember) {
|
|
try {
|
|
$hasBarobillLogin = ! empty($barobillMember->barobill_id) && ! empty($barobillMember->barobill_pwd);
|
|
} catch (\Throwable $e) {
|
|
$hasBarobillLogin = ! empty($barobillMember->barobill_id) && ! empty($barobillMember->getRawOriginal('barobill_pwd'));
|
|
}
|
|
}
|
|
|
|
return view('barobill.settings.index', compact('currentTenant', 'barobillMember', 'isTestMode', 'hasBarobillLogin'));
|
|
}
|
|
|
|
/**
|
|
* 전자세금계산서 페이지
|
|
*/
|
|
public function taxInvoice(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.tax-invoice.index'));
|
|
}
|
|
|
|
return view('barobill.tax-invoice.index');
|
|
}
|
|
|
|
/**
|
|
* 계좌조회 페이지
|
|
*/
|
|
public function bankAccount(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.bank-account.index'));
|
|
}
|
|
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$currentTenant = Tenant::find($tenantId);
|
|
$barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
|
|
$isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;
|
|
|
|
return view('barobill.bank-account.index', compact('currentTenant', 'barobillMember', 'isTestMode'));
|
|
}
|
|
|
|
/**
|
|
* 카드사용내역 페이지
|
|
*/
|
|
public function cardUsage(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.card-usage.index'));
|
|
}
|
|
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$currentTenant = Tenant::find($tenantId);
|
|
$barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
|
|
$isTestMode = $barobillMember ? $barobillMember->isTestMode() : true;
|
|
|
|
return view('barobill.card-usage.index', compact('currentTenant', 'barobillMember', 'isTestMode'));
|
|
}
|
|
|
|
/**
|
|
* 홈텍스매입/매출 페이지
|
|
*/
|
|
public function hometax(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.hometax.index'));
|
|
}
|
|
|
|
return view('barobill.hometax.index');
|
|
}
|
|
|
|
/**
|
|
* 사용량조회 페이지
|
|
*/
|
|
public function usage(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.usage.index'));
|
|
}
|
|
|
|
// 현재 선택된 테넌트 정보
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$currentTenant = Tenant::find($tenantId);
|
|
|
|
// 해당 테넌트의 바로빌 회원사 정보
|
|
$barobillMember = BarobillMember::where('tenant_id', $tenantId)->first();
|
|
|
|
// 본사(테넌트 1) 여부
|
|
$isHeadquarters = $tenantId == 1;
|
|
|
|
return view('barobill.usage.index', compact('currentTenant', 'barobillMember', 'isHeadquarters'));
|
|
}
|
|
|
|
/**
|
|
* 거래처 검색 (전자세금계산서 공급받는자 검색용)
|
|
*/
|
|
public function searchTradingPartners(Request $request): JsonResponse
|
|
{
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$keyword = $request->input('keyword', '');
|
|
|
|
$query = TradingPartner::forTenant($tenantId)->active();
|
|
|
|
if ($keyword) {
|
|
$query->where(function ($q) use ($keyword) {
|
|
$q->where('name', 'like', "%{$keyword}%")
|
|
->orWhere('biz_no', 'like', "%{$keyword}%")
|
|
->orWhere('manager', 'like', "%{$keyword}%");
|
|
});
|
|
}
|
|
|
|
$partners = $query->orderBy('name')
|
|
->limit(50)
|
|
->get(['id', 'name', 'biz_no', 'ceo', 'address', 'type', 'category', 'contact', 'email', 'manager', 'manager_phone']);
|
|
|
|
return response()->json($partners);
|
|
}
|
|
|
|
/**
|
|
* 과금관리 페이지 (본사 전용)
|
|
*/
|
|
public function billing(Request $request): View|Response
|
|
{
|
|
if ($request->header('HX-Request')) {
|
|
return response('', 200)->header('HX-Redirect', route('barobill.billing.index'));
|
|
}
|
|
|
|
// 현재 선택된 테넌트 정보
|
|
$tenantId = session('selected_tenant_id', 1);
|
|
$currentTenant = Tenant::find($tenantId);
|
|
|
|
// 본사(테넌트 1) 여부
|
|
$isHeadquarters = $tenantId == 1;
|
|
|
|
// 테넌트 목록 (전체 테넌트 모드에서 선택용)
|
|
$tenants = Tenant::select('id', 'company_name')->orderBy('company_name')->get();
|
|
|
|
return view('barobill.billing.index', compact('currentTenant', 'isHeadquarters', 'tenants'));
|
|
}
|
|
}
|