Compare commits
2 Commits
24ac3f169e
...
ec34ae348c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec34ae348c | ||
|
|
9d7d1e8a94 |
@@ -47,7 +47,9 @@ class Manual extends BaseConfig
|
||||
*/
|
||||
public array $screenHelp = [
|
||||
'bag/order/phone' => 'sales#전화 주문 접수',
|
||||
'bag/order/lot-seed' => 'order#LOT-No 디스켓 불출',
|
||||
'bag/order' => 'order#발주 등록',
|
||||
'bag/password-change' => 'account#비밀번호 변경',
|
||||
'bag/bag-orders' => 'order#발주 현황',
|
||||
'bag/receiving' => 'order#입고 처리',
|
||||
'bag/bag-receivings' => 'order#입고 현황',
|
||||
@@ -58,9 +60,19 @@ class Manual extends BaseConfig
|
||||
'bag/bag-issues' => 'sales#무료용 불출 처리',
|
||||
'bag/bag-sales' => 'sales#판매/반품 현황',
|
||||
'bag/shop-orders' => 'sales#전화 주문 접수',
|
||||
'bag/flow' => 'reports',
|
||||
'bag/flow' => 'reports#기간별 봉투 수불 현황',
|
||||
'bag/reports/misc-flow' => 'reports#기타 입출고',
|
||||
'bag/reports/returns' => 'reports#반품/파기 현황',
|
||||
'bag/reports/lot-flow' => 'reports#LOT 수불 조회',
|
||||
'bag/reports/supply-demand' => 'reports#쓰레기봉투 수급 계획',
|
||||
'bag/reports/shop-sales' => 'reports#지정 판매소별 판매현황',
|
||||
'bag/reports/daily-summary' => 'reports#일계표',
|
||||
'bag/reports/period-sales' => 'reports#그 밖의 현황',
|
||||
'bag/reports/yearly-sales' => 'reports#그 밖의 현황',
|
||||
'bag/reports/sales-ledger' => 'reports#그 밖의 현황',
|
||||
'bag/reports/hometax-export' => 'reports#그 밖의 현황',
|
||||
'bag/reports' => 'reports#일계표',
|
||||
'bag/analytics' => 'reports',
|
||||
'bag/analytics' => 'reports#그 밖의 현황',
|
||||
'bag/designated-shops' => 'basic#지정판매소 관리',
|
||||
'bag/bag-prices' => 'basic#단가 관리',
|
||||
'bag/prices' => 'basic#단가 관리',
|
||||
|
||||
@@ -2560,7 +2560,8 @@ class SalesReport extends BaseController
|
||||
return redirect()->to(work_area_home_url())->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$queried = $this->request->getGet('search') === '1';
|
||||
// 첫 진입(search 파라미터 없음)에도 기본 조건(이번 달·불출)으로 자동 조회해 바로 표시한다.
|
||||
$queried = ($this->request->getGet('search') ?? '1') === '1';
|
||||
$startDate = (string) ($this->request->getGet('start_date') ?? date('Y-m-01'));
|
||||
$endDate = (string) ($this->request->getGet('end_date') ?? date('Y-m-d'));
|
||||
if ($startDate > $endDate) {
|
||||
@@ -3189,7 +3190,8 @@ class SalesReport extends BaseController
|
||||
$salesScope = 'all';
|
||||
}
|
||||
|
||||
$queried = $this->request->getGet('search') === '1';
|
||||
// 첫 진입(search 파라미터 없음)에도 기본 조건(오늘·40일·ALL)으로 자동 조회해 바로 표시한다.
|
||||
$queried = ($this->request->getGet('search') ?? '1') === '1';
|
||||
$built = (new \App\Libraries\BagSupplyPlanBuilder())->build(
|
||||
$lgIdx,
|
||||
$refDate,
|
||||
|
||||
@@ -3302,7 +3302,8 @@ SQL);
|
||||
public function flow(): string
|
||||
{
|
||||
$lgIdx = $this->lgIdx();
|
||||
$queried = $this->request->getGet('search') === '1'
|
||||
// 첫 진입(search 파라미터 없음)에도 기본 조건(이번 달·전체)으로 자동 조회해 바로 표시한다.
|
||||
$queried = ($this->request->getGet('search') ?? '1') === '1'
|
||||
|| $this->request->getGet('start_date') !== null
|
||||
|| $this->request->getGet('end_date') !== null;
|
||||
|
||||
|
||||
@@ -55,7 +55,15 @@
|
||||
|
||||
화면 오른쪽 위 **[로그아웃]** 을 누르면 안전하게 종료됩니다. 공용 PC라면 사용 후 꼭 로그아웃하세요.
|
||||
|
||||
## 4. 비밀번호·계정 문제
|
||||
## 4. 비밀번호 변경 · *비밀번호 변경*
|
||||
|
||||
- **비밀번호를 바꾸거나 분실**한 경우, 계정·권한 변경은 **담당 관리자**가 처리합니다. 관리자에게 문의하세요.
|
||||
로그인한 본인이 직접 비밀번호를 바꾸는 화면입니다.
|
||||
|
||||
**입력**: 현재 비밀번호 → 새 비밀번호 → 새 비밀번호 확인.
|
||||
**순서**: 현재 비밀번호가 맞아야 변경되며, 새 비밀번호는 확인란과 동일해야 합니다.
|
||||
> 주기적으로 변경하고, 다른 사이트와 같은 비밀번호는 피하세요.
|
||||
|
||||
## 5. 비밀번호 분실 · 계정·권한 문제
|
||||
|
||||
- **비밀번호를 분실**해 로그인 자체가 안 되는 경우에는 **담당 관리자**가 초기화해 줍니다. 관리자에게 문의하세요.
|
||||
- 권한(역할)을 바꾸고 싶을 때도 관리자에게 요청하면 됩니다.
|
||||
|
||||
@@ -64,3 +64,17 @@
|
||||
**필터**: 입고기간 · 제작업체 · 품명 · 입고구분(전체/완료/미완료).
|
||||
**표 컬럼**: 입고일자 · 품명 · 입고수량 · 발주일자 · 발주수량 · 발주번호 · 제작업체 · **입고여부(완료/미완료)** · 입고처 · 비고.
|
||||
**버튼**: `엑셀저장` · `인쇄`.
|
||||
|
||||
---
|
||||
|
||||
## LOT-No 디스켓 불출 · *발주 입고 관리 › LOT-No 디스켓 불출*
|
||||
|
||||
발주별 **LOT 번호 시드(seed) 데이터를 파일로 생성**하는 화면입니다. (바코드·LOT 부여에 쓰는 디스켓/파일 형태 데이터)
|
||||
|
||||
**필터**: 시작월 · 종료월 · LOT-No · 제작업체.
|
||||
**순서**
|
||||
1. 기간·조건으로 발주 목록을 조회합니다.
|
||||
2. 해당 발주 행의 **`seed 생성`** 을 눌러 그 발주의 LOT 시드 파일을 만듭니다.
|
||||
|
||||
**표 컬럼**: 발주일자 · LOT-No · 품명 · 수량 · 제작업체 · (생성 버튼).
|
||||
> 정상·취소 발주가 함께 조회되며, 시드 생성은 발주 단위로 동작합니다.
|
||||
|
||||
@@ -56,6 +56,47 @@
|
||||
|
||||
---
|
||||
|
||||
## 기타 입출고 · *봉투 수불 관리 › 기타 입출고*
|
||||
|
||||
정상적인 **발주입고 · 판매 · 불출** 흐름에 속하지 않는 **그 밖의 재고 증감**을 수동으로 기록하는 화면입니다.
|
||||
(예: 분실·파손, 실사 차이 보정, 행정상 조정, 타 부서 이관 등)
|
||||
|
||||
**구분**
|
||||
- **입고(in)**: 재고가 **늘어나는** 조정 (예: 누락분 추가, 반입).
|
||||
- **출고(out)**: 재고가 **줄어드는** 조정 (예: 파손·분실 차감).
|
||||
|
||||
**등록 입력값** *(모두 필수)*
|
||||
- **구분**: 입고 / 출고
|
||||
- **봉투**: 봉투코드(봉투구분으로 먼저 좁혀서 선택)
|
||||
- **수량**: 1 이상
|
||||
- **일자**: 처리 기준일
|
||||
- **사유**: 왜 조정하는지(필수, 최대 200자) — 추후 추적·감사를 위해 구체적으로 적습니다.
|
||||
|
||||
**조회·표시**
|
||||
- **수불년월 · 구분**으로 묶여 좌측 **목록(마스터)** → 우측 **상세 내역**으로 표시됩니다.
|
||||
- 봉투구분으로 필터링할 수 있습니다.
|
||||
|
||||
**반영**: 등록한 입고/출고 수량은 **재고와 봉투 수불 집계에 그대로 반영**되므로, 정확한 사유와 수량으로 신중히 입력하세요. 잘못 등록한 행은 삭제로 정정합니다.
|
||||
|
||||
> 정상 업무(발주·판매·불출)는 각 전용 화면에서 처리하고, **여기서는 그 흐름으로 설명되지 않는 예외적 증감만** 기록합니다.
|
||||
|
||||
---
|
||||
|
||||
## 쓰레기봉투 수급 계획 · *봉투 수불 관리 › 쓰레기봉투 수급 계획*
|
||||
|
||||
봉투 품목별로 **현재고가 며칠 버티는지, 언제·얼마나 발주할지**를 보여 주는 수급·발주 계획표입니다. 처음 들어가면 기본 조건으로 자동 조회됩니다.
|
||||
|
||||
**필터**
|
||||
- **기준일**: 계산 기준 날짜.
|
||||
- **제작기일(리드타임, 일)**: 발주 후 입고까지 걸리는 기간(기본 40일). 재고 소진 전에 미리 발주하려는 여유.
|
||||
- **재고/판매 범위**: 기존(수기·바코드 미등록) / 바코드(등록) / 전체.
|
||||
|
||||
**표 구성(3그룹)**: ① 최근 발주 내역 ② 현재고 및 예상 판매일수 ③ 추가발주 예정내역.
|
||||
**핵심 계산**: **발주예정일 = 기준일 + 소진일수 − 보유일수**. 발주예정일이 지난(긴급) 품목은 **빨간색**으로 표시되고, 그 시점에 맞춘 **추가 발주 제안 장수**가 함께 나옵니다.
|
||||
> 발주 타이밍을 놓치지 않도록 돕는 화면입니다. 빨간 품목부터 발주를 검토하세요.
|
||||
|
||||
---
|
||||
|
||||
## 그 밖의 현황
|
||||
- **기간별 판매현황 / 년 판매 현황**: 기간·연도 단위 판매 집계.
|
||||
- **지정 판매소 (일/기간) 판매대장**: 판매소별 거래 장부.
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
**상세**: 사업자번호 · 우편번호 · 도로명/지번주소 · 이메일 · 결제 계좌 등.
|
||||
> 목록에서 가게를 고르면 우측에 상세가 표시됩니다. (등록·수정은 관리자)
|
||||
|
||||
**함께 제공되는 화면**
|
||||
- **지정판매소 바코드 발행**: 판매소를 골라 봉투 바코드 라벨을 인쇄용으로 출력합니다.
|
||||
- **구별 신규/취소 명단**: 기간 내 새로 등록되거나 취소된 판매소 명단을 조회·엑셀저장합니다.
|
||||
- **지정판매소 조회(브라우즈)**: 등록된 판매소를 검색·열람만 하는 보기 전용 화면입니다.
|
||||
|
||||
---
|
||||
|
||||
## 단가 관리 · *기본정보관리 › 단가 관리*
|
||||
|
||||
@@ -170,13 +170,17 @@ tailwind.config = {
|
||||
// 글씨 크기 조절(A−/A+) — 본문 + 상단 대메뉴 + 좌측 사이드바에 zoom 적용. 사이트/워크스페이스와 배율 공유.
|
||||
(function () {
|
||||
var FONT_KEY = 'jrj_font_scale';
|
||||
var scaleSelectors = ['.portal-header', '.sidebar', '.work-main'];
|
||||
// 상단 헤더는 제외 → A−/A+ 버튼이 커지거나 밀리지 않아 연속 클릭이 편하다.
|
||||
var scaleSelectors = ['.sidebar', '.work-main'];
|
||||
function curScale() { var s = parseInt(localStorage.getItem(FONT_KEY) || '100', 10); return (s >= 70 && s <= 150) ? s : 100; }
|
||||
function applyScale(s) {
|
||||
s = Math.min(150, Math.max(70, s));
|
||||
try { localStorage.setItem(FONT_KEY, String(s)); } catch (e) {}
|
||||
var z = s / 100;
|
||||
scaleSelectors.forEach(function (sel) { var el = document.querySelector(sel); if (el) el.style.zoom = z; });
|
||||
// 상단 대메뉴는 font-size 만 키운다(바 높이 48px 고정 → A−/A+ 버튼이 안 밀림).
|
||||
var topnav = document.querySelector('.portal-top-nav');
|
||||
if (topnav) topnav.style.fontSize = (0.875 * z).toFixed(4) + 'rem';
|
||||
var pct = document.getElementById('wsFontPct'); if (pct) pct.textContent = s + '%';
|
||||
}
|
||||
applyScale(curScale());
|
||||
|
||||
@@ -264,15 +264,19 @@ tailwind.config = {
|
||||
document.addEventListener('mousemove', function (e) { if (!dragging) return; var w = window.innerWidth - e.clientX; drawer.style.width = Math.min(window.innerWidth * 0.92, Math.max(300, w)) + 'px'; });
|
||||
document.addEventListener('mouseup', function () { if (!dragging) return; dragging = false; ov.style.display = 'none'; document.body.style.userSelect = ''; });
|
||||
|
||||
// 글씨 크기 조절 — 본문 + 상단 대메뉴 + 좌측 사이드바(메뉴)에 zoom 적용.
|
||||
// 글씨 크기 조절 — 본문 + 좌측 사이드바에 zoom 적용.
|
||||
// 상단 헤더는 제외 → A−/A+ 버튼이 커지거나 밀리지 않아 연속 클릭이 편하다.
|
||||
var FONT_KEY = 'jrj_font_scale';
|
||||
var scaleSelectors = ['.portal-header', '.sidebar', '.work-main'];
|
||||
var scaleSelectors = ['.sidebar', '.work-main'];
|
||||
function curScale() { var s = parseInt(localStorage.getItem(FONT_KEY) || '100', 10); return (s >= 70 && s <= 150) ? s : 100; }
|
||||
function applyScale(s) {
|
||||
s = Math.min(150, Math.max(70, s));
|
||||
try { localStorage.setItem(FONT_KEY, String(s)); } catch (e) {}
|
||||
var z = s / 100;
|
||||
scaleSelectors.forEach(function (sel) { var el = document.querySelector(sel); if (el) el.style.zoom = z; });
|
||||
// 상단 대메뉴는 font-size 만 키운다(바 높이 48px 고정 → A−/A+ 버튼이 안 밀림).
|
||||
var topnav = document.querySelector('.portal-top-nav');
|
||||
if (topnav) topnav.style.fontSize = (0.875 * z).toFixed(4) + 'rem';
|
||||
var pct = document.getElementById('wsFontPct'); if (pct) pct.textContent = s + '%';
|
||||
}
|
||||
applyScale(curScale());
|
||||
|
||||
@@ -490,10 +490,13 @@ if ($effectiveLgIdx) {
|
||||
var pct = document.getElementById('wsFontPct'); if (pct) pct.textContent = s + '%';
|
||||
// 탭(iframe) 내용
|
||||
Object.keys(tabs).forEach(function (k) { try { tabs[k].frame.contentDocument.documentElement.style.zoom = z; } catch (e) {} });
|
||||
// 셸 메뉴(상단 대메뉴 + 좌측 사이드바)도 함께 확대
|
||||
['.portal-header', '.sidebar'].forEach(function (sel) {
|
||||
// 좌측 사이드바 + 탭 바 텍스트도 함께 확대.
|
||||
['.sidebar', '#wsTabBar'].forEach(function (sel) {
|
||||
var el = document.querySelector(sel); if (el) el.style.zoom = z;
|
||||
});
|
||||
// 상단 대메뉴는 font-size 만 키운다(바 높이 48px 고정 → A−/A+ 버튼이 안 밀림).
|
||||
var topnav = document.querySelector('.portal-top-nav');
|
||||
if (topnav) topnav.style.fontSize = (0.875 * z).toFixed(4) + 'rem';
|
||||
}
|
||||
(function () {
|
||||
setFontScale(curFontScale()); // 저장된 배율을 셸 메뉴에도 적용(초기 로드)
|
||||
|
||||
Reference in New Issue
Block a user