MainframeExit-BankA/Workspace
PAYROLL-BATCH-001.cblPayrollBatchJob.java97.2% confidencemedium risk
PAYROLL-BATCH-001.cblCOBOL
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. PAYROLL-BATCH-001.
3 AUTHOR. SYSTEM.
4
5 ENVIRONMENT DIVISION.
6 INPUT-OUTPUT SECTION.
7 FILE-CONTROL.
8 SELECT EMPLOYEE-FILE ASSIGN TO "EMP.DAT"
9 ORGANIZATION IS SEQUENTIAL.
10 SELECT PAYROLL-OUTPUT ASSIGN TO "PAY.OUT"
11 ORGANIZATION IS SEQUENTIAL.
12
13 DATA DIVISION.
14 FILE SECTION.
15 FD EMPLOYEE-FILE.
16 01 EMPLOYEE-RECORD.
17 05 EMP-ID PIC X(8).
18 05 EMP-NAME PIC X(30).
19 05 EMP-HOURS PIC 9(3)V9(2).
20 05 EMP-RATE PIC 9(5)V9(2).
21 05 EMP-TAX-CODE PIC X(2).
22
23 WORKING-STORAGE SECTION.
24 01 WS-GROSS-PAY PIC 9(7)V9(2).
25 01 WS-TAX-AMOUNT PIC 9(7)V9(2).
26 01 WS-NET-PAY PIC 9(7)V9(2).
27 01 WS-EOF PIC X VALUE 'N'.
28
29 PROCEDURE DIVISION.
30 MAIN-PARA.
31 OPEN INPUT EMPLOYEE-FILE
32 OPEN OUTPUT PAYROLL-OUTPUT
33 PERFORM READ-EMPLOYEES
34 UNTIL WS-EOF = 'Y'
35 CLOSE EMPLOYEE-FILE
36 CLOSE PAYROLL-OUTPUT
37 STOP RUN.
38
39 READ-EMPLOYEES.
40 READ EMPLOYEE-FILE
41 AT END MOVE 'Y' TO WS-EOF
42 NOT AT END PERFORM CALC-PAYROLL
43 END-READ.
44
45 CALC-PAYROLL.
46 COMPUTE WS-GROSS-PAY =
47 EMP-HOURS * EMP-RATE
48 PERFORM CALC-TAX
49 COMPUTE WS-NET-PAY =
50 WS-GROSS-PAY - WS-TAX-AMOUNT
51 WRITE PAYROLL-OUTPUT FROM WS-NET-PAY.
52
53 CALC-TAX.
54 EVALUATE EMP-TAX-CODE
55 WHEN 'S1'
56 COMPUTE WS-TAX-AMOUNT =
57 WS-GROSS-PAY * 0.20
58 WHEN 'S2'
59 COMPUTE WS-TAX-AMOUNT =
60 WS-GROSS-PAY * 0.28
61 WHEN OTHER
62 COMPUTE WS-TAX-AMOUNT =
63 WS-GROSS-PAY * 0.35
64 END-EVALUATE.
PayrollBatchJob.javaJava 21
1package com.bank.payroll;
2
3import com.bank.payroll.model.Employee;
4import com.bank.payroll.model.PayrollResult;
5import com.bank.payroll.repository.EmployeeRepository;
6import com.bank.payroll.repository.PayrollOutputRepository;
7import org.springframework.batch.core.Job;
8import org.springframework.batch.core.Step;
9import org.springframework.batch.core.job.builder.JobBuilder;
10import org.springframework.batch.core.step.builder.StepBuilder;
11import org.springframework.batch.item.ItemProcessor;
12import org.springframework.stereotype.Component;
13import java.math.BigDecimal;
14import java.math.RoundingMode;
15
16/**
17 * PayrollBatchJob — translated from PAYROLL-BATCH-001.cbl
18 * Translation confidence: 97.2% | Semantic equivalence: HIGH
19 */
20@Component
21public class PayrollBatchJob {
22
23 private final EmployeeRepository employeeRepository;
24 private final PayrollOutputRepository payrollOutputRepository;
25
26 public PayrollBatchJob(
27 EmployeeRepository employeeRepository,
28 PayrollOutputRepository payrollOutputRepository) {
29 this.employeeRepository = employeeRepository;
30 this.payrollOutputRepository = payrollOutputRepository;
31 }
32
33 public Job buildJob(JobBuilder jobBuilder, Step payrollStep) {
34 return jobBuilder.get("payrollBatchJob")
35 .start(payrollStep)
36 .build();
37 }
38
39 public Step buildPayrollStep(StepBuilder stepBuilder) {
40 return stepBuilder.get("payrollStep")
41 .<Employee, PayrollResult>chunk(100)
42 .reader(employeeRepository::findAll)
43 .processor(payrollProcessor())
44 .writer(payrollOutputRepository::saveAll)
45 .build();
46 }
47
48 // Corresponds to CALC-PAYROLL + CALC-TAX paragraphs
49 private ItemProcessor<Employee, PayrollResult> payrollProcessor() {
50 return employee -> {
51 BigDecimal grossPay = employee.getHoursWorked()
52 .multiply(employee.getHourlyRate())
53 .setScale(2, RoundingMode.HALF_UP);
54
55 BigDecimal taxAmount = calculateTax(grossPay, employee.getTaxCode());
56 BigDecimal netPay = grossPay.subtract(taxAmount);
57
58 return new PayrollResult(
59 employee.getId(),
60 grossPay,
61 taxAmount,
62 netPay
63 );
64 };
65 }
66
67 // EVALUATE EMP-TAX-CODE → Java 21 switch expression
68 private BigDecimal calculateTax(BigDecimal grossPay, String taxCode) {
69 return switch (taxCode) {
70 case "S1" -> grossPay.multiply(BigDecimal.valueOf(0.20));
71 case "S2" -> grossPay.multiply(BigDecimal.valueOf(0.28));
72 default -> grossPay.multiply(BigDecimal.valueOf(0.35));
73 };
74 }
75}