Skip to content

Commit

Permalink
support SSCC18 Manuafacturer codes with more than 8 digits
Browse files Browse the repository at this point in the history
* ExportHelper - minor log-level changes
#5896

(cherry picked from commit 15c4020)
  • Loading branch information
metas-ts committed Dec 19, 2019
1 parent c426050 commit 373f731
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,6 @@ public ExportHelper(final Properties ctx, @NonNull final ClientId AD_Client_ID)

/**
* Process - Generate Export Format
*
* @return info
*/
public String exportRecord(final PO po, final Integer ReplicationMode, final String ReplicationType, final Integer ReplicationEvent) throws ReplicationException
{
Expand Down Expand Up @@ -206,17 +204,17 @@ public Document createExportDOM(
}
// metas: tsa: end
final I_AD_Client client = Services.get(IClientDAO.class).retriveClient(po.getCtx(), m_AD_Client_ID);
log.info("Client = " + client.toString());
log.debug("Client = " + client.toString());

log.info("po.getAD_Org_ID() = " + po.getAD_Org_ID());
log.debug("po.getAD_Org_ID() = " + po.getAD_Org_ID());

log.info("po.get_TrxName() = " + po.get_TrxName());
log.debug("po.get_TrxName() = " + po.get_TrxName());
if (po.get_TrxName() == null || po.get_TrxName().equals(""))
{
po.set_TrxName("exportRecord");
}

log.info("Table = " + po.get_TableName());
log.debug("Table = " + po.get_TableName());

if (po.get_KeyColumns().length < 1)
{
Expand Down Expand Up @@ -282,7 +280,7 @@ public Document exportRecord(final MEXPFormat exportFormat, final String where,
{
final I_AD_Client client = Services.get(IClientDAO.class).retriveClient(exportFormat.getCtx(), m_AD_Client_ID);
final MTable table = MTable.get(exportFormat.getCtx(), exportFormat.getAD_Table_ID());
log.info("Table = " + table);
log.debug("Table = " + table);

// metas: begin: build where clause
final StringBuffer whereClause = new StringBuffer("1=1");
Expand All @@ -304,7 +302,7 @@ public Document exportRecord(final MEXPFormat exportFormat, final String where,

for (final PO po : records)
{
log.info("Client = " + client.toString());
log.debug("Client = " + client.toString());
log.trace("po.getAD_Org_ID() = " + po.getAD_Org_ID());
log.trace("po.get_TrxName() = " + po.get_TrxName());
if (po.get_TrxName() == null || po.get_TrxName().equals(""))
Expand Down Expand Up @@ -366,7 +364,7 @@ private void generateExportFormat(final Document outDocument, final Element root

for (final I_EXP_FormatLine formatLine : formatLines)
{
log.info("Format Line Seach key: {}", formatLine.getValue());
log.debug("Format Line Seach key: {}", formatLine.getValue());

try
{
Expand Down Expand Up @@ -471,7 +469,7 @@ else if (X_EXP_FormatLine.TYPE_EmbeddedEXPFormat.equals(formatLineType))
final MEXPFormat embeddedFormat = MEXPFormat.get(masterPO.getCtx(), embeddedFormat_ID, masterPO.get_TrxName());

final MTable tableEmbedded = MTable.get(masterPO.getCtx(), embeddedFormat.getAD_Table_ID());
log.info("Table Embedded = " + tableEmbedded);
log.debug("Table Embedded = " + tableEmbedded);

final String linkColumnName = getLinkColumnName(masterPO, tableEmbedded); // metas
final Object linkId = masterPO.get_Value(linkColumnName); // metas
Expand Down Expand Up @@ -578,7 +576,7 @@ else if (DisplayType.isLookup(displayType, true)) // includeHardcodedLookups=tru
throw new IllegalStateException("Column's reference type not supported: " + column + " , DisplayType=" + displayType);
}

log.info("Embedded: Table={}, KeyColumName={}", new Object[] { embeddedTableName, embeddedKeyColumnName });
log.debug("Embedded: Table={}, KeyColumName={}", new Object[] { embeddedTableName, embeddedKeyColumnName });

final StringBuilder whereClause = new StringBuilder().append(embeddedKeyColumnName).append("=?");
if (!Check.isEmpty(embeddedFormat.getWhereClause()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,31 +97,39 @@ private String getManufacturerCode(@NonNull final OrgId orgId)
* @return true if the check digit is correct, false otherwise
*/
@Override
public boolean isCheckDigitValid(final SSCC18 sscc18)
public boolean isCheckDigitValid(@NonNull final SSCC18 sscc18)
{
final int result = computeCheckDigit(sscc18);

final int checkDigit = sscc18.getCheckDigit();

if (checkDigit == result % 10)
{
return true;
}

return false;
}

private int computeCheckDigit(final SSCC18 sscc18)
{
final int extentionDigit = sscc18.getExtensionDigit();
final String manufacturerCode = sscc18.getManufacturerCode().trim();
final String serialNumber = sscc18.getSerialNumber().trim();
final int checkDigit = sscc18.getCheckDigit();

final String stringSSCC18ToVerify = extentionDigit
+ manufacturerCode
+ serialNumber;

final int result = computeCheckDigit(stringSSCC18ToVerify);

if (checkDigit == result % 10)
{
return true;
}

return false;
return result;
}

@Override
public int computeCheckDigit(final String stringSSCC18ToVerify)
{
Check.assume(stringSSCC18ToVerify.length() == 17, "Incorrect SSCC18");
Check.assume(stringSSCC18ToVerify.length() == 17,
"The given SSCC18-String={} needs to have 17 digits, but has {}", stringSSCC18ToVerify, stringSSCC18ToVerify.length());

int sumOdd = 0;
int sumEven = 0;
Expand Down Expand Up @@ -159,44 +167,31 @@ public SSCC18 generate(@NonNull final OrgId orgId, final int serialNumber)
//
// Retrieve and validate ManufacturerCode
final String manufacturerCode_SysConfig = getManufacturerCode(orgId);
Check.assumeNotEmpty(manufacturerCode_SysConfig, "Manufacturer code {} may not be empty; orgId={}", manufacturerCode_SysConfig, orgId);
Check.assume(StringUtils.isNumber(manufacturerCode_SysConfig), "Manufacturer code {} need to be a number; orgId={}", manufacturerCode_SysConfig, orgId);

final int manufacturerCodeSize = manufacturerCode_SysConfig.length();
Check.assume(manufacturerCodeSize <= 8, "Manufacturer code too long: {}", manufacturerCode_SysConfig);
Check.assumeNotEmpty(manufacturerCode_SysConfig, "Manufacturer code may not be empty; orgId={}", orgId);

//
// Validate serialNumber and adjust serialNumber and manufacturerCode paddings
final String serialNumberStr = String.valueOf(serialNumber);
final int serialNumberSize = serialNumberStr.length();
Check.assume(serialNumberSize <= 9, "Serial number too long: {}; orgId={}", serialNumberStr, orgId);
final String finalManufacturerCode;
final String finalSerialNumber;
if (manufacturerCodeSize == 8)
{
Check.assume(serialNumberSize <= 8, "Serial number too long: {}; orgId={}", serialNumberStr, orgId);
finalSerialNumber = StringUtils.lpadZero(serialNumberStr, 8, "Manufacturer code size shoult be 8");

finalManufacturerCode = manufacturerCode_SysConfig;
}
else if (manufacturerCodeSize == 7)
final String manufacturerCode;
if (manufacturerCode_SysConfig.length() < 7)
{
finalSerialNumber = StringUtils.lpadZero(serialNumberStr, 9, "Manufacturer code size shoult be 9");

finalManufacturerCode = manufacturerCode_SysConfig;
manufacturerCode = StringUtils.lpadZero(getManufacturerCode(orgId), 7, "lpad the manufacturerCode to at least 7");
}
// manufacturer code smaller than 7
else
{
finalSerialNumber = StringUtils.lpadZero(serialNumberStr, 9, "Manufacturer code size shoult be " + 9);

finalManufacturerCode = StringUtils.lpadZero(manufacturerCode_SysConfig, 7, "Manufacturer code size shoult be " + 7);
manufacturerCode = manufacturerCode_SysConfig;
}

Check.assume(StringUtils.isNumber(manufacturerCode), "Manufacturer code {} need to be a number; orgId={}", manufacturerCode, orgId);

validateManufacturerCode(manufacturerCode);

final String serialNumberStr = String.valueOf(serialNumber);
final int serialNumberTargetSize = validateSerialNumber(manufacturerCode, serialNumberStr);

final String finalSerialNumber = StringUtils.lpadZero(serialNumberStr, serialNumberTargetSize, "");

final int extensionDigit = getExtensionDigit(orgId);
final int checkDigit = computeCheckDigit(extensionDigit + finalManufacturerCode + finalSerialNumber);
final int checkDigit = computeCheckDigit(extensionDigit + manufacturerCode + finalSerialNumber);

return new SSCC18(extensionDigit, finalManufacturerCode, finalSerialNumber, checkDigit);
return new SSCC18(extensionDigit, manufacturerCode, finalSerialNumber, checkDigit);
}

@Override
Expand All @@ -205,14 +200,33 @@ public void validate(final SSCC18 sscc18ToValidate)
final String manufactCode = sscc18ToValidate.getManufacturerCode().trim();
final String serialNumber = sscc18ToValidate.getSerialNumber().trim();

Check.assume(StringUtils.isNumber(manufactCode), "The manufacturer code " + manufactCode + " is not a number");
Check.assume(manufactCode.length() <= 8, "The manufacturer code " + manufactCode + "is too long");
validateManufacturerCode(manufactCode);

final int digitsAvailableForSerialNumber = validateSerialNumber(manufactCode, serialNumber);
Check.errorIf(serialNumber.length() > digitsAvailableForSerialNumber, "With a {}-digit manufactoring code={}, the serial number={} may only have {} digits", manufactCode.length(), manufactCode, serialNumber, digitsAvailableForSerialNumber);

final int computeCheckDigit = computeCheckDigit(sscc18ToValidate);
Check.errorUnless(sscc18ToValidate.getCheckDigit() == computeCheckDigit, "The check digit of SSCC18={} is not valid; It needs to be={}", toString(sscc18ToValidate, false), computeCheckDigit);
Check.errorUnless(isCheckDigitValid(sscc18ToValidate), "Check digit is not valid");
}

private int validateSerialNumber(final String manufactCode, final String serialNumber)
{
final int digitsAvailableForSerialNumber = computeLenghtOfSerialNumber(manufactCode);
Check.errorUnless(StringUtils.isNumber(serialNumber), "The serial number " + serialNumber + " is not a number");
return digitsAvailableForSerialNumber;
}

Check.assume(StringUtils.isNumber(serialNumber), "The serial number " + serialNumber + " is not a number");
Check.assume(serialNumber.length() <= 9, "The serial number " + serialNumber + "is too long");
private int computeLenghtOfSerialNumber(final String manufactCode)
{
final int digitsAvailableForSerialNumber = 18 - 1/* extension-digit */ - manufactCode.length() - 1/* check-digit */;
return digitsAvailableForSerialNumber;
}

Check.assume((serialNumber + manufactCode).length() == 16, "Manufacturer code + serial number must be 16");
Check.assume(isCheckDigitValid(sscc18ToValidate), "Check digit is not valid");
private void validateManufacturerCode(@NonNull final String manufactCode)
{
Check.errorUnless(StringUtils.isNumber(manufactCode), "The manufacturer code " + manufactCode + " is not a number");
Check.errorIf(manufactCode.length() > 9, "The manufacturer code " + manufactCode + " is too long");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,15 @@ public void testGenerateSSCC18value11()
);
}

@Test
public void testGenerateSSCC18value9DigitManufacturerCode()
{
setManufacturerCode("123456789");
final SSCC18CodeBL sscc18CodeBL = new SSCC18CodeBL(orgId -> 23);
final SSCC18 generatedSSCC18 = sscc18CodeBL.generate(OrgId.ANY);
assertThat(sscc18CodeBL.toString(generatedSSCC18, false)).hasSize(18).isEqualTo("012345678900000234");
}

@Test
public void testcheckValidSSCC18() // NOPMD by ts on 26.07.13 15:15 OK, method under test is expected to just return without exception
{
Expand Down Expand Up @@ -193,8 +202,20 @@ public void testcheckValidSSCC18_tooLongManufacturerCode()

final SSCC18 sscc18ToValidate = new SSCC18(extensionDigit, manufacturerCode, serialNumber, checkDigit);
sscc18CodeBL.validate(sscc18ToValidate);
}

StaticHUAssert.assertMock("mock");
@Test
public void testcheckValidSSCC18_9digitManufacturerCode()
{
final String manufacturerCode = "764011946";
final String serialNumber = "0000002";
final int checkDigit = 4;
final int extensionDigit = 0;

final SSCC18 sscc18ToValidate = new SSCC18(extensionDigit, manufacturerCode, serialNumber, checkDigit);
sscc18CodeBL.validate(sscc18ToValidate);

assertThat(sscc18CodeBL.toString(sscc18ToValidate, false)).hasSize(18).isEqualTo("0" + manufacturerCode + serialNumber + checkDigit);
}

@Test(expected = AdempiereException.class)
Expand All @@ -207,8 +228,6 @@ public void testcheckValidSSCC18_NotDigit()

final SSCC18 sscc18ToValidate = new SSCC18(extensionDigit, manufacturerCode, serialNumber, checkDigit);
sscc18CodeBL.validate(sscc18ToValidate);

StaticHUAssert.assertMock("mock");
}

@Test(expected = AdempiereException.class)
Expand All @@ -221,8 +240,6 @@ public void testcheckValidSSCC18_ManufacturingCodePlusSerialNumberTooLong()

final SSCC18 sscc18ToValidate = new SSCC18(extensionDigit, manufacturerCode, serialNumber, checkDigit);
sscc18CodeBL.validate(sscc18ToValidate);

StaticHUAssert.assertMock("mock");
}

@Test
Expand Down

0 comments on commit 373f731

Please sign in to comment.