Skip to content

Commit 1518512

Browse files
feat: P4ADEV-4419 add broker barcode & fix layout (#517)
1 parent a2c4484 commit 1518512

File tree

4 files changed

+90
-67
lines changed

4 files changed

+90
-67
lines changed

src/main/java/it/gov/pagopa/pu/debtpositions/service/create/receipt/ReceiptFileServiceImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class ReceiptFileServiceImpl implements ReceiptFileService {
3030
public static final String RECEIPT_ORG_NAME = "orgName";
3131
public static final String RECEIPT_NAV = "nav";
3232
public static final String RECEIPT_NAV_BARCODE = "navBarcode";
33+
public static final String RECEIPT_ORG_FISCAL_CODE_BARCODE = "orgFiscalCodeBarcode";
3334
public static final String RECEIPT_DEBTOR_NAME = "debtorName";
3435
public static final String RECEIPT_DEBTOR_FISCAL_CODE = "debtorFiscalCode";
3536
public static final String RECEIPT_PAYMENT_DATE = "paymentDate";
@@ -87,12 +88,15 @@ private Map<String, Object> buildTemplateModel(ReceiptDetailDTO receiptDetail, O
8788
templateModel.put(RECEIPT_NAV, nav);
8889
templateModel.put(RECEIPT_NAV_BARCODE, BarcodeUtils.generateCode128AsBase64(nav));
8990

91+
String orgFiscalCode = StringUtils.defaultString(organization.getOrgFiscalCode());
92+
templateModel.put(RECEIPT_ORG_FISCAL_CODE, orgFiscalCode);
93+
templateModel.put(RECEIPT_ORG_FISCAL_CODE_BARCODE, BarcodeUtils.generateCode128AsBase64(orgFiscalCode));
94+
9095
templateModel.put(RECEIPT_DEBTOR_NAME, receiptDetail.getDebtor().getFullName());
9196
templateModel.put(RECEIPT_DEBTOR_FISCAL_CODE, receiptDetail.getDebtor().getFiscalCode());
9297
templateModel.put(RECEIPT_PAYMENT_DATE, receiptDetail.getPaymentDateTime() != null ? receiptDetail.getPaymentDateTime().format(DATE_TIME_FORMATTER) : "");
9398
templateModel.put(RECEIPT_PSP_NAME, receiptDetail.getPspCompanyName());
9499
templateModel.put(RECEIPT_AMOUNT, Utilities.formatPrice(receiptDetail.getPaymentAmountCents()));
95-
templateModel.put(RECEIPT_ORG_FISCAL_CODE, organization.getOrgFiscalCode());
96100
templateModel.put(REMITTANCE_INFORMATION, StringUtils.defaultString(receiptDetail.getRemittanceInformation()));
97101
templateModel.put(IUR, receiptDetail.getIur());
98102
templateModel.put(IUD, receiptDetail.getIud());

src/main/resources/documents_composition_templates/Receipt.html

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,32 +51,32 @@ <h1>RICEVUTA TELEMATICA</h1>
5151
<h2 class="remittance-title">${remittanceInformation}</h2>
5252
</div>
5353

54-
<div class="debtor-grid">
55-
<div class="debtor-row">
56-
<div class="debtor-cell debtor-cell-left">
57-
<div class="debtor-block">
58-
<div class="info-label">Debitore</div>
59-
<div class="info-value">
60-
${debtorName}<br/>
61-
<span class="fiscal-code">${debtorFiscalCode}</span>
62-
</div>
63-
</div>
64-
<div class="debtor-block">
65-
<div class="info-label">Ente Creditore</div>
66-
<div class="info-value">
67-
${orgName}<br/>
68-
<span class="org-fiscal-code">${orgFiscalCode}</span>
69-
</div>
70-
</div>
54+
<div class="details-row">
55+
<div class="details-cell details-cell-debtor">
56+
<div class="barcode-spacer"></div>
57+
<div class="info-label">Debitore</div>
58+
<div class="info-value">
59+
${debtorName}<br/>
60+
<span class="fiscal-code">${debtorFiscalCode}</span>
7161
</div>
72-
<div class="debtor-cell debtor-cell-right">
73-
<div class="info-label">Codice Avviso</div>
74-
<div class="info-value">
75-
<span class="payment-code">${nav}</span>
76-
<div class="barcode-container">
77-
<img src="${navBarcode}" alt="Barcode Codice Avviso" class="barcode-image" />
78-
</div>
79-
</div>
62+
</div>
63+
<div class="details-cell details-cell-org">
64+
<div class="barcode-container">
65+
<img src="${orgFiscalCodeBarcode}" alt="Barcode Ente Creditore" class="barcode-image" />
66+
</div>
67+
<div class="info-label">Ente Creditore</div>
68+
<div class="info-value">
69+
${orgName}<br/>
70+
<span class="org-fiscal-code">${orgFiscalCode}</span>
71+
</div>
72+
</div>
73+
<div class="details-cell details-cell-nav">
74+
<div class="barcode-container">
75+
<img src="${navBarcode}" alt="Barcode Codice Avviso" class="barcode-image" />
76+
</div>
77+
<div class="info-label">Codice Avviso</div>
78+
<div class="info-value">
79+
<span class="payment-code">${nav}</span>
8080
</div>
8181
</div>
8282
</div>

src/main/resources/documents_composition_templates/styles/index.css

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ body {
158158

159159
.background-color {
160160
background: #F9FAFB;
161-
padding: 19.81px 0 19.81px 19.81px;
161+
padding: 19.81px;
162162
margin: 0;
163163
border-radius: 8.35px;
164164
}
@@ -177,56 +177,44 @@ body {
177177
margin-bottom: 25px;
178178
}
179179

180-
/* Debtor Grid */
181-
.debtor-grid {
182-
width: 100%;
183-
margin-bottom: 25px;
184-
}
185-
186-
.debtor-row {
180+
/* Details Row (3 columns) */
181+
.details-row {
187182
display: table;
188183
width: 100%;
189184
}
190185

191-
.debtor-cell {
186+
.details-cell {
192187
display: table-cell;
193188
vertical-align: top;
189+
padding-right: 15px;
194190
}
195191

196-
.debtor-cell-left {
197-
width: 60%;
198-
padding-right: 40px;
192+
.details-cell:last-child {
193+
padding-right: 0;
199194
}
200195

201-
.debtor-cell-right {
202-
width: 40%;
196+
.details-cell-debtor {
197+
width: 25%;
203198
}
204199

205-
.debtor-block {
206-
margin-bottom: 20px;
200+
.details-cell-org {
201+
width: 38%;
207202
}
208203

209-
.debtor-block:last-child {
210-
margin-bottom: 0;
204+
.details-cell-nav {
205+
width: 37%;
206+
text-align: right;
211207
}
212208

213-
.fiscal-code,
214-
.org-fiscal-code,
215-
.payment-code {
216-
font-family: 'DMMono', monospace;
217-
font-size: 14px;
218-
line-height: 11.89px;
219-
font-weight: 500;
220-
color: #000;
221-
vertical-align: middle;
222-
display: inline-block;
223-
margin-top: 5px;
209+
/* Barcode spacer for debtor column (matches barcode height) */
210+
.barcode-spacer {
211+
height: 14mm;
212+
margin-bottom: 12px;
224213
}
225214

226-
227215
/* Barcode Section */
228216
.barcode-container {
229-
margin-top: 8px;
217+
margin-bottom: 12px;
230218
overflow: hidden;
231219
}
232220

@@ -236,6 +224,27 @@ body {
236224
display: block;
237225
}
238226

227+
.details-cell-nav .barcode-container {
228+
text-align: right;
229+
}
230+
231+
.details-cell-nav .barcode-image {
232+
display: inline-block;
233+
}
234+
235+
.fiscal-code,
236+
.org-fiscal-code,
237+
.payment-code {
238+
font-family: 'DMMono', monospace;
239+
font-size: 14px;
240+
line-height: 11.89px;
241+
font-weight: 500;
242+
color: #000;
243+
vertical-align: middle;
244+
display: inline-block;
245+
margin-top: 5px;
246+
}
247+
239248
/* Footer IDs Section */
240249
.footer-ids {
241250
margin-top: 30px;

src/test/java/it/gov/pagopa/pu/debtpositions/service/create/receipt/ReceiptFileServiceImplTest.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class ReceiptFileServiceImplTest {
4545
private final String accessToken = "fakeAccessToken";
4646
private final String userId = "USERID";
4747

48-
private static final String FAKE_BARCODE_BASE64 = "data:image/png;base64,fakeBarcode";
48+
private static final String FAKE_NAV_BARCODE_BASE64 = "data:image/png;base64,fakeNavBarcode";
49+
private static final String FAKE_ORG_BARCODE_BASE64 = "data:image/png;base64,fakeOrgBarcode";
4950

5051
@BeforeEach
5152
void setUp() {
@@ -77,14 +78,17 @@ void givenValidUserWhenGetReceiptPdfThenOk() throws TemplateException, IOExcepti
7778
"RECEIPT_"+organization.getOrgFiscalCode()+"_"+receiptId+".pdf");
7879

7980
try (MockedStatic<BarcodeUtils> barcodeUtilsMock = Mockito.mockStatic(BarcodeUtils.class)) {
80-
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(Mockito.eq(receiptDetailDTO.getNav())))
81-
.thenReturn(FAKE_BARCODE_BASE64);
81+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(receiptDetailDTO.getNav()))
82+
.thenReturn(FAKE_NAV_BARCODE_BASE64);
83+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(organization.getOrgFiscalCode()))
84+
.thenReturn(FAKE_ORG_BARCODE_BASE64);
8285

8386
Mockito.when(documentCompositionMock.executePdfTemplate(Mockito.eq(DocumentComposition.TemplateType.RECEIPT), Mockito.argThat((Map<String, Object> o) ->
8487
o.get(ReceiptFileServiceImpl.RECEIPT_LOGO).equals(organization.getOrgLogo())
8588
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_NAME).equals(organization.getOrgName())
8689
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV).equals(receiptDetailDTO.getNav())
87-
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_BARCODE_BASE64)
90+
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_NAV_BARCODE_BASE64)
91+
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_FISCAL_CODE_BARCODE).equals(FAKE_ORG_BARCODE_BASE64)
8892
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_NAME).equals(receiptDetailDTO.getDebtor().getFullName())
8993
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_FISCAL_CODE).equals(receiptDetailDTO.getDebtor().getFiscalCode())
9094
&& o.get(ReceiptFileServiceImpl.RECEIPT_PAYMENT_DATE).equals(receiptDetailDTO.getPaymentDateTime().format(DATE_TIME_FORMATTER))
@@ -124,8 +128,10 @@ void givenIOExceptionWhenGetReceiptPdfThenIllegalStateException() throws Templat
124128
organization.setOrgFiscalCode("FISCALCODE");
125129

126130
try (MockedStatic<BarcodeUtils> barcodeUtilsMock = Mockito.mockStatic(BarcodeUtils.class)) {
127-
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(Mockito.eq(receiptDetailDTO.getNav())))
128-
.thenReturn(FAKE_BARCODE_BASE64);
131+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(receiptDetailDTO.getNav()))
132+
.thenReturn(FAKE_NAV_BARCODE_BASE64);
133+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(organization.getOrgFiscalCode()))
134+
.thenReturn(FAKE_ORG_BARCODE_BASE64);
129135

130136
Mockito.when(receiptServiceMock.getReceiptDetail(receiptId, userId, organizationId, null))
131137
.thenReturn(receiptDetailDTO);
@@ -137,7 +143,8 @@ void givenIOExceptionWhenGetReceiptPdfThenIllegalStateException() throws Templat
137143
o.get(ReceiptFileServiceImpl.RECEIPT_LOGO).equals(organization.getOrgLogo())
138144
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_NAME).equals(organization.getOrgName())
139145
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV).equals(receiptDetailDTO.getNav())
140-
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_BARCODE_BASE64)
146+
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_NAV_BARCODE_BASE64)
147+
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_FISCAL_CODE_BARCODE).equals(FAKE_ORG_BARCODE_BASE64)
141148
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_NAME).equals(receiptDetailDTO.getDebtor().getFullName())
142149
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_FISCAL_CODE).equals(receiptDetailDTO.getDebtor().getFiscalCode())
143150
&& o.get(ReceiptFileServiceImpl.RECEIPT_PAYMENT_DATE).equals(receiptDetailDTO.getPaymentDateTime().format(DATE_TIME_FORMATTER))
@@ -168,8 +175,10 @@ void givenTemplateExceptionWhenGetReceiptPdfThenIllegalStateException() throws T
168175
organization.setOrgFiscalCode("FISCALCODE");
169176

170177
try (MockedStatic<BarcodeUtils> barcodeUtilsMock = Mockito.mockStatic(BarcodeUtils.class)) {
171-
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(Mockito.eq(receiptDetailDTO.getNav())))
172-
.thenReturn(FAKE_BARCODE_BASE64);
178+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(receiptDetailDTO.getNav()))
179+
.thenReturn(FAKE_NAV_BARCODE_BASE64);
180+
barcodeUtilsMock.when(() -> BarcodeUtils.generateCode128AsBase64(organization.getOrgFiscalCode()))
181+
.thenReturn(FAKE_ORG_BARCODE_BASE64);
173182

174183
Mockito.when(receiptServiceMock.getReceiptDetail(receiptId, userId, organizationId, null))
175184
.thenReturn(receiptDetailDTO);
@@ -181,7 +190,8 @@ void givenTemplateExceptionWhenGetReceiptPdfThenIllegalStateException() throws T
181190
o.get(ReceiptFileServiceImpl.RECEIPT_LOGO).equals(organization.getOrgLogo())
182191
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_NAME).equals(organization.getOrgName())
183192
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV).equals(receiptDetailDTO.getNav())
184-
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_BARCODE_BASE64)
193+
&& o.get(ReceiptFileServiceImpl.RECEIPT_NAV_BARCODE).equals(FAKE_NAV_BARCODE_BASE64)
194+
&& o.get(ReceiptFileServiceImpl.RECEIPT_ORG_FISCAL_CODE_BARCODE).equals(FAKE_ORG_BARCODE_BASE64)
185195
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_NAME).equals(receiptDetailDTO.getDebtor().getFullName())
186196
&& o.get(ReceiptFileServiceImpl.RECEIPT_DEBTOR_FISCAL_CODE).equals(receiptDetailDTO.getDebtor().getFiscalCode())
187197
&& o.get(ReceiptFileServiceImpl.RECEIPT_PAYMENT_DATE).equals(receiptDetailDTO.getPaymentDateTime().format(DATE_TIME_FORMATTER))

0 commit comments

Comments
 (0)