Common User Area

공통 사용자 페이지

작업자 공통 기능 및 계약서 연동

회원정보 정산 서류 제출 계약서 상태

작업자 공통 화면과 계약서 연동 흐름

마이페이지, 작업료 정산, 서류 업로드, 계약서 요청과 상태 확인이 같은 사용자 영역 안에서 이어지도록 재구성했습니다. 계약서 양식별 템플릿 자동 입력, 상태 반영, 다운로드 동선이 한 화면에서 보이도록 정리했습니다.

공통 사용자 메뉴
내 정보
정산
계약서
보안서약
마이페이지
기본 정보
성함
홍길동
연락처
010-1234-5678
이메일
worker@example.com
비밀번호
본인 인증 후 변경
연락 수신 동의
동의
거부
추가 정보 / 지급 정보
생년월일
1994-08-21
성별
남성
거주 지역
서울
직업
프리랜서
은행 / 계좌번호
국민은행 / 123-45-678901
주민등록번호
암호화 저장 후 계약서 입력 시 복호화 사용
작업 기록 / 정산
작업료 지급 요청
항목 현재 포인트 지급 가능
차트 이미지-텍스트 쌍 데이터 184,000 요청 가능
관광분야 이미지-텍스트 쌍 데이터 72,000 대기
한국형 대규모 비전 데이터셋 312,000 요청 가능
지급 전 확인사항
필수 서류
신분증 사본 통장 사본 보안서약서
상태
모든 지급 필수 정보가 입력되어 있습니다.
정산 요청
계약서 상태
프로젝트별 계약서 목록
프로젝트 계약서 제목 상태 동작
한국형 대규모 비전 데이터셋 수집/정제 참여 계약서 미작성 작성 요청
차트 이미지-텍스트 쌍 데이터 가공 참여 계약서 작성 중 작성 확인
관광분야 이미지-텍스트 쌍 데이터 수집 참여 계약서 작성 완료 다운로드
작성 요청 전 체크
계약서 양식에 필요한 기본 정보, 지급 정보, 추가 정보가 모두 채워져 있어야 요청 버튼이 활성화됩니다.
상태값 예시
상태값 예시
apply = 미작성
pending = 작성 중
submit = 관리자 검토중
success = 작성 완료
안내 문구
메일로 전송된 계약서를 작성한 뒤, 다시 이 페이지에서 상태 확인 버튼을 눌러 결과를 동기화하는 흐름을 사용했습니다.
관리자 발송 / 템플릿 자동 입력
관리자 발송 대상 목록
사용자 프로젝트 필수 정보 발송
worker01 비전 데이터셋 충족 계약서 발송
worker02 차트 데이터 추가 정보 필요 발송 불가
worker03 관광 데이터 충족 재발송
양식별 기본 입력값 템플릿
참가자 정보
이름 → participantMappings.name 이메일 → signingMethod.value
요청자 입력값 자동 주입
주민등록번호 연락처 계좌번호 직업 주소 계약일자
프로젝트별 분기
`AGREES_options.php`에서 계약서 `aid`마다 다른 `requesterInputMappings`를 구성해 템플릿 필드를 자동 채우는 구조였습니다.
상태 동기화 / 결과 반영
상태 동기화 흐름
Step 01 관리자 또는 사용자가 계약서 요청을 실행하면 모두싸인 문서 ID가 저장되고 상태가 `pending`으로 변경됩니다.
Step 02 사용자 화면에서 `작성 확인`을 누르면 문서 상태를 조회하여 `ON_GOING`, `ABORTED`, `COMPLETED` 같은 결과를 받습니다.
Step 03 완료 시 PDF를 내려받아 보관 경로에 저장하고, 사용자 계약서 상태와 프로젝트 참여 상태를 함께 갱신합니다.
Step 04 이후 사용자 화면에서는 `작성 완료`, `다운로드 가능`, 프로젝트 권한 활성화 상태로 표시됩니다.
결과 반영 예시
동기화 전
계약서 작성 요청 완료
현재 상태: 작성 중
동기화 후
현재 상태: 관리자 검토중 또는 작성 완료
완료 문서 다운로드 가능
프로젝트 권한 반영
계약서 완료 이후에는 프로젝트 참여 상태가 승인되고, 선택된 작업 유형의 접근 권한이 활성화되는 흐름이 뒤따랐습니다.
관련 코드

$document = [
    "document" => [
        "participantMappings" => [
            [
                "excluded" => false,
                "signingMethod" => [
                    "type" => "EMAIL",
                    "value" => $uinfo["email"]
                ],
                "signingDuration" => 20160,
                "locale" => "ko",
                "role" => "근로자",
                "name" => $uinfo["name"]
            ]
        ],
        "requesterInputMappings" => [
            [
                "dataLabel" => "성명1",
                "value" => $uinfo["name"]
            ],
            [
                "dataLabel" => "주민등록번호1",
                "value" => $upays["signnum"]
            ],
            [
                "dataLabel" => "연락처",
                "value" => $uinfo["contact"]
            ],
            [
                "dataLabel" => "은행",
                "value" => $upays["bank"]
            ],
            [
                "dataLabel" => "계좌번호1",
                "value" => $upays["banknum"]
            ],
            [
                "dataLabel" => "직업1",
                "value" => $umeta["job"]
            ],
            [
                "dataLabel" => "계약일자 1",
                "value" => date("Y-m-d")
            ]
        ],
        "folderId" => "7b9fa580-fdb9-11ec-986f-b37efb0c0853",
        "title" => $ainfo["title"]
    ],
    "templateId" => $ainfo["API_ID"]
];

$response = $client->request(
    'POST',
    'https://api.modusign.co.kr/documents/request-with-template',
    $option
);

$return = json_decode($response->getBody(), true);

m_update(
    [
        $uakey => "pending"
    ],
    "`na-now`.`Workers-projects`",
    [
        "uid" => $uinfo["uid"]
    ]
);

m_update(
    [
        $uakey . "_status" => "pending",
        $uakey . "_result" => json_encode([
            "result_id" => $return["id"],
            "src" => "",
            "updated" => date("Y-m-d H:i:s")
        ])
    ],
    "`na-now`.`Workers-agrees`",
    [
        "uid" => $uinfo["uid"]
    ]
);

$response = $client->request(
    'GET',
    'https://api.modusign.co.kr/documents/' . $id,
    [
        'headers' => [
            'Accept' => 'application/json',
            'Authorization' => 'Basic ...'
        ]
    ]
);

$return = json_decode($response->getBody(), true);

switch ($return["status"]) {
    case "ON_GOING":
    case "ON_PROCESSING":
        $ret = ["none", "서명 진행 중"];
        break;

    case "PROCESSING_FAILED":
    case "ABORTED":
        $ret = ["fail", "서명을 다시 진행해 주세요."];
        $type = "remove";
        break;

    case "COMPLETED":
        $ret = ["success", "서명 완료"];
        $type = "success";
        break;
}
$file = file_get_contents($return["file"]["downloadUrl"]);

$upload_dir = "/Na-now-Work-User-AGREES/" . $session_search["uid"] . "/";
$path = md5(microtime()) . '.pdf';

$json_ = [
    "result_id" => $return["id"],
    "src" => $upload_dir . $path,
    "updated" => date("Y-m-d H:i:s")
];

m_update(
    [
        $uakey => "submit"
    ],
    "`na-now`.`Workers-projects`",
    [
        "uid" => $uinfo["uid"]
    ]
);
페이지 이동

같은 과제 안의 다른 화면으로 이동하거나 메인 개요 페이지로 돌아갈 수 있습니다.