private final void actionPerformed0(ActionEvent e) throws Exception { // Select Instance if (e.getSource() == bSelectExistingASI) { cmd_select(); return; } // New/Edit else if (e.getSource() == cbNewEdit) { cmd_newEdit(); } // Select Lot from existing else if (e.getSource() == fieldLot) { final KeyNamePair pp = fieldLot.getSelectedItem(); if (pp != null && pp.getKey() != -1) { fieldLotString.setText(pp.getName()); fieldLotString.setEditable(false); asiTemplate.setM_Lot_ID(pp.getKey()); } else { fieldLotString.setEditable(true); asiTemplate.setM_Lot_ID(0); } } // Create New Lot else if (e.getSource() == bLot) { KeyNamePair pp = asiTemplate.createLot(m_M_Product_ID); if (pp != null) { fieldLot.addItem(pp); fieldLot.setSelectedItem(pp); } } // Create New SerNo else if (e.getSource() == bSerNo) { fieldSerNo.setText(asiTemplate.getSerNo(true)); } // OK else if (e.getActionCommand().equals(ConfirmPanel.A_OK)) { final MAttributeSetInstance asi = saveSelection(); final int M_Locator_ID = -1; // N/A setResultAndDispose(asi, M_Locator_ID); return; } // Cancel else if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL)) { final int M_Locator_ID = -1; // N/A setResultAndDispose(null, M_Locator_ID); } // Zoom M_Lot else if (e.getSource() == mZoom) { cmd_zoom(); } else { log.log(Level.SEVERE, "Unknown event: {0}", e); } } // actionPerformed
private void changeBOMLine(BOMLineWrapper line, MProduct p, MAttributeSetInstance asi) { // BigDecimal maxLength = messenger.getLength(p, asi); // BigDecimal neededLength = line.getLength(); // BigDecimal onehundred = new BigDecimal(100); // line.setQtyBatch(neededLength.divide(maxLength, 2, // BigDecimal.ROUND_HALF_UP).multiply(onehundred)); // line.setScrap(onehundred.subtract(line.getQtyBatch()).intValue()); line.setM_AttributeSetInstance_ID(asi.getM_AttributeSetInstance_ID()); savePO(line.get()); }
/** * Loads the ASI template to be used. * * @param fromAttributeSetInstanceId * @return * <ul> * <li>ASI template * <li><code>null</code> if this is not a valid settings and we need to dispose the dialog * </ul> * * @throws AdempiereException if something failed */ private final MAttributeSetInstance loadASITemplate(final int fromAttributeSetInstanceId) { final Properties ctx = getCtx(); final int productId = getM_Product_ID(); final boolean isPureProductASI = isPureProductASI(); // // If there is not product specified // and we need a pure product ASI (i.e. not the ASI that we configure on product level) // => this dialog does not make sense and we need to dispose it ASAP // TODO: in future we shall do this checking BEFORE we reach this point if (productId <= 0 && isPureProductASI) { return null; } final MAttributeSetInstance asiTemplate; // // Load/Create the ASI // Get the M_AttributeSet. MAttributeSet as = null; if (productId > 0) { // Get/Create the ASI asiTemplate = MAttributeSetInstance.get(ctx, fromAttributeSetInstanceId, productId); if (asiTemplate == null) { throw new AdempiereException( "@NotFound@ @M_AttributeSetInstance_ID@ (@M_Product_ID@=" + productId + ")"); } Env.setContext(ctx, m_WindowNo, "M_AttributeSet_ID", asiTemplate.getM_AttributeSet_ID()); // Get Attribute Set as = asiTemplate.getMAttributeSet(); } else { final int M_AttributeSet_ID = attributeContext.getM_AttributeSet_ID(); asiTemplate = new MAttributeSetInstance(ctx, 0, M_AttributeSet_ID, ITrx.TRXNAME_None); // new ASI as = asiTemplate.getMAttributeSet(); if (as == null && M_AttributeSet_ID == 0) { // FIXME: workaround to deal with M_AttributeSet_ID=0 which is an existing record as = queryBL .createQueryBuilder(I_M_AttributeSet.class) .setContext(ctx, ITrx.TRXNAME_None) .addEqualsFilter(I_M_AttributeSet.COLUMNNAME_M_AttributeSet_ID, 0) .create() .firstOnlyNotNull(MAttributeSet.class); asiTemplate.setMAttributeSet(as); } } // Product has no Attribute Set if (as == null) { throw new AdempiereException("@PAttributeNoAttributeSet@"); } // Product has no Instance Attributes if (isPureProductASI && !as.isInstanceAttribute()) { throw new AdempiereException("@PAttributeNoInstanceAttribute@"); } return asiTemplate; }
/** Update which fields status (read-only/read-write) based on New ASI/Edit ASI checkbox. */ private final void cmd_newEdit() { final boolean rw = cbNewEdit.isSelected(); log.config("R/W=" + rw + " " + asiTemplate); // Lot final boolean isNewLot = asiTemplate == null || asiTemplate.getM_Lot_ID() <= 0; fieldLotString.setEditable(rw && isNewLot); if (fieldLot != null) { fieldLot.setReadWrite(rw); } bLot.setReadWrite(rw); // Serial No fieldSerNo.setReadWrite(rw); bSerNo.setReadWrite(rw); // Guarantee Date fieldGuaranteeDate.setReadWrite(rw); // Attribute Editors for (final CEditor editor : attributeId2editor.values()) { editor.setReadWrite(rw); } } // cmd_newEdit
private MAttributeSetInstance saveSelection0() { log.info(""); final MAttributeSet as = asiTemplate.getMAttributeSet(); Check.assumeNotNull(as, "as not null"); // Create a new ASI which is copying the existing one final MAttributeSetInstance asi = new MAttributeSetInstance(getCtx(), 0, ITrx.TRXNAME_ThreadInherited); InterfaceWrapperHelper.copyValues( asiTemplate, asi, false); // honorIsCalculated=false => copy everything asi.setM_AttributeSet(as); // make sure we have the right AttributeSet model set // boolean changed = false; final Set<String> mandatory = new LinkedHashSet<>(); // Lot if (!m_productWindow && as.isLot()) { String text = fieldLotString.getText(); asi.setLot(text); if (as.isLotMandatory() && (text == null || text.length() == 0)) { mandatory.add(msgBL.translate(getCtx(), "Lot")); } changed = true; } // Lot // Serial No if (!m_productWindow && as.isSerNo()) { final String serNo = fieldSerNo.getText(); asi.setSerNo(serNo); if (as.isSerNoMandatory() && Check.isEmpty(serNo, true)) { mandatory.add(msgBL.translate(getCtx(), "SerNo")); } changed = true; } // SerNo // // Guarantee Date (if required) if (fieldGuaranteeDateDisplayed) { final Timestamp guaranteeDate = fieldGuaranteeDate.getValue(); asi.setGuaranteeDate(guaranteeDate); if (as.isGuaranteeDate() && as.isGuaranteeDateMandatory() && guaranteeDate == null) { mandatory.add(msgBL.translate(getCtx(), I_M_AttributeSetInstance.COLUMNNAME_GuaranteeDate)); } changed = true; } // // New Instance if (changed || asi.getM_AttributeSetInstance_ID() <= 0) { InterfaceWrapperHelper.save(asi); changed = true; } final int attributeSetInstanceId = asi.getM_AttributeSetInstance_ID(); // // Save Instance Attributes for (final MAttribute attribute : m_attributes) { final CEditor editor = attributeId2editor.get(attribute.getM_Attribute_ID()); if (MAttribute.ATTRIBUTEVALUETYPE_List.equals(attribute.getAttributeValueType())) { @SuppressWarnings("unchecked") final CComboBox<I_M_AttributeValue> editorCombo = (CComboBox<I_M_AttributeValue>) editor; final I_M_AttributeValue attributeValue = editorCombo.getSelectedItem(); if (attribute.isMandatory() && attributeValue == null) { mandatory.add(attribute.getName()); } attribute.setMAttributeInstance(attributeSetInstanceId, attributeValue); } else if (MAttribute.ATTRIBUTEVALUETYPE_Number.equals(attribute.getAttributeValueType())) { final VNumber editorNumber = (VNumber) editor; final BigDecimal value = (BigDecimal) editorNumber.getValue(); if (attribute.isMandatory() && value == null) { mandatory.add(attribute.getName()); } attribute.setMAttributeInstance(attributeSetInstanceId, value); } else if (MAttribute.ATTRIBUTEVALUETYPE_Date.equals(attribute.getAttributeValueType())) { final VDate editorDate = (VDate) editor; final Timestamp value = editorDate.getValue(); if (attribute.isMandatory() && value == null) { mandatory.add(attribute.getName()); } attribute.setMAttributeInstance(attributeSetInstanceId, value); } else { final VString editorString = (VString) editor; final String value = editorString.getText(); if (attribute.isMandatory() && Check.isEmpty(value, false)) { mandatory.add(attribute.getName()); } attribute.setMAttributeInstance(attributeSetInstanceId, value); } changed = true; } // for all attributes // // Throw exception if there are some mandatory fields which were not set if (!mandatory.isEmpty()) { throw new AdempiereException("@FillMandatory@ " + StringUtils.toString(mandatory, ", ")); } // Save Model if (changed) { asi.setMAttributeSet(as); // NOTE: this is workaround for the case when M_AttributeSet_ID=0 attributeSetInstanceBL.setDescription(asi); InterfaceWrapperHelper.save(asi); } return asi; }
/** * Add Attribute Line * * @param attribute attribute * @param product product level attribute * @param readOnly value is read only */ private void addAttributeLine(final MAttribute attribute) { final boolean product = m_productWindow; final boolean readOnly = false; log.fine(attribute + ", Product=" + product + ", R/O=" + readOnly); CLabel label = new CLabel(attribute.getName()); if (product) { label.setFont(new Font(label.getFont().getFontName(), Font.BOLD, label.getFont().getSize())); } if (attribute.getDescription() != null) { label.setToolTipText(attribute.getDescription()); } centerPanel.add(label, new ALayoutConstraint(m_row++, 0)); // final int attributeSetInstanceId = asiTemplate.getM_AttributeSetInstance_ID(); final int attributeId = attribute.getM_Attribute_ID(); final MAttributeInstance instance = attribute.getMAttributeInstance(attributeSetInstanceId); if (MAttribute.ATTRIBUTEVALUETYPE_List.equals(attribute.getAttributeValueType())) { InterfaceWrapperHelper.setDynAttribute( attribute, Env.DYNATTR_WindowNo, attributeContext.getWindowNo()); InterfaceWrapperHelper.setDynAttribute( attribute, Env.DYNATTR_TabNo, attributeContext.getTabNo()); // tabNo final I_M_AttributeValue[] values = attribute.getMAttributeValues(getSOTrx()); // optional = null final CComboBox<I_M_AttributeValue> editor = new CComboBox<>(values); boolean found = false; if (instance != null && instance.getM_AttributeValue_ID() > 0) { for (int i = 0; i < values.length; i++) { if (values[i] != null && values[i].getM_AttributeValue_ID() == instance.getM_AttributeValue_ID()) { editor.setSelectedIndex(i); found = true; break; } } if (found) log.fine( "Attribute=" + attribute.getName() + " #" + values.length + " - found: " + instance); else log.warning( "Attribute=" + attribute.getName() + " #" + values.length + " - NOT found: " + instance); } // setComboBox else { log.fine("Attribute=" + attribute.getName() + " #" + values.length + " no instance"); } label.setLabelFor(editor); centerPanel.add(editor, null); if (readOnly) editor.setEnabled(false); else attributeId2editor.put(attributeId, editor); } else if (MAttribute.ATTRIBUTEVALUETYPE_Number.equals(attribute.getAttributeValueType())) { final VNumber editor = new VNumber( attribute.getName(), // ColumnName attribute.isMandatory(), // mandatory false, // IsReadOnly true, // IsUpdateable DisplayType.Number, // DisplayType attribute.getName() // Title ); if (instance != null) { if (InterfaceWrapperHelper.isNull(instance, I_M_AttributeInstance.COLUMNNAME_ValueNumber)) { editor.setValue(null); } else { editor.setValue(instance.getValueNumber()); } } else { // better don't set a default value // editor.setValue(Env.ZERO); } label.setLabelFor(editor); centerPanel.add(editor, null); if (readOnly) editor.setEnabled(false); else attributeId2editor.put(attributeId, editor); } else if (MAttribute.ATTRIBUTEVALUETYPE_Date.equals(attribute.getAttributeValueType())) { final VDate editor = new VDate( attribute.getName(), // columnName attribute.isMandatory(), // mandatory false, // isReadOnly true, // isUpdateable DisplayType.Date, // displayType attribute.getName() // title ); if (instance != null) editor.setValue(instance.getValueDate()); label.setLabelFor(editor); centerPanel.add(editor, null); if (readOnly) editor.setEnabled(false); else attributeId2editor.put(attributeId, editor); } else // Text Field { VString editor = new VString( attribute.getName(), // ColumnName attribute.isMandatory(), // mandatory false, // isReadOnly true, // isUpdateable 20, // displayLength INSTANCE_VALUE_LENGTH, // fieldLength null, // VFormat null // ObscureType ); if (instance != null) editor.setText(instance.getValue()); label.setLabelFor(editor); centerPanel.add(editor, null); if (readOnly) editor.setEnabled(false); else attributeId2editor.put(attributeId, editor); } // // Add our attribute to the list of attributes m_attributes.add(attribute); } // addAttributeLine
/** Initialize all panel fields and editors based on {@link #asiTemplate}. */ private final void initAttributes() { final Properties ctx = getCtx(); final boolean isProductWindow = isProductWindow(); final boolean isProcessParameter = isProcessParameter(); final boolean isPureProductASI = isPureProductASI(); final boolean allowSelectExistingASI = isAllowSelectExistingASI(); final MAttributeSet as = asiTemplate.getMAttributeSet(); Check.assumeNotNull(as, "attribute set not null"); final boolean isASITemplateNew = asiTemplate.getM_AttributeSetInstance_ID() <= 0; // // Show Select existing ASI (if allowed) if (allowSelectExistingASI) { // New/Edit - Selection if (isASITemplateNew) // new ASI cbNewEdit.setText(msgBL.getMsg(ctx, "NewRecord")); else cbNewEdit.setText(msgBL.getMsg(ctx, "EditRecord")); cbNewEdit.addActionListener(this); centerPanel.add(cbNewEdit, new ALayoutConstraint(m_row++, 0)); bSelectExistingASI.setText(msgBL.getMsg(ctx, "SelectExisting")); bSelectExistingASI.addActionListener(this); centerPanel.add(bSelectExistingASI, null); } // // Fetch M_Attributes final List<MAttribute> attributes; if (isProductWindow) { attributes = Arrays.asList(as.getMAttributes(false)); // non-instance attributes } else if (isPureProductASI) { // Regular product's attribute set instance attributes attributes = Arrays.asList(as.getMAttributes(true)); // all instance attributes } else if (isProcessParameter) { final IQueryBuilder<MAttribute> attributesQueryBuilder = queryBL .createQueryBuilder(MAttribute.class) .setContext(ctx, ITrx.TRXNAME_None) .addOnlyActiveRecordsFilter() .addOnlyContextClient(); attributesQueryBuilder .orderBy() .addColumn(I_M_Attribute.COLUMNNAME_Name) .addColumn(I_M_Attribute.COLUMNNAME_M_Attribute_ID); attributes = attributesQueryBuilder.create().list(MAttribute.class); } else { attributes = Collections.emptyList(); } // // Create attributes UI editors for (final MAttribute attribute : attributes) { if (!attributeExcludeBL.isExcludedAttribute( attribute, as, m_AD_Column_ID, attributeContext.isSOTrx())) { addAttributeLine(attribute); } } // // Lot if (isPureProductASI && as.isLot()) { CLabel label = new CLabel(msgBL.translate(ctx, "Lot")); label.setLabelFor(fieldLotString); centerPanel.add(label, new ALayoutConstraint(m_row++, 0)); centerPanel.add(fieldLotString, null); fieldLotString.setText(asiTemplate.getLot()); // M_Lot_ID // int AD_Column_ID = 9771; // M_AttributeSetInstance.M_Lot_ID // fieldLot = new VLookup ("M_Lot_ID", false,false, true, // MLookupFactory.get(getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.TableDir)); final String sql = "SELECT M_Lot_ID, Name " + "FROM M_Lot l " + "WHERE EXISTS (SELECT M_Product_ID FROM M_Product p " + "WHERE p.M_AttributeSet_ID=" + asiTemplate.getM_AttributeSet_ID() + " AND p.M_Product_ID=l.M_Product_ID)"; fieldLot = new CComboBox<>(DB.getKeyNamePairs(sql, true)); label = new CLabel(msgBL.translate(ctx, "M_Lot_ID")); label.setLabelFor(fieldLot); centerPanel.add(label, new ALayoutConstraint(m_row++, 0)); centerPanel.add(fieldLot, null); if (asiTemplate.getM_Lot_ID() > 0) { for (int i = 1; i < fieldLot.getItemCount(); i++) { KeyNamePair pp = fieldLot.getItemAt(i); if (pp.getKey() == asiTemplate.getM_Lot_ID()) { fieldLot.setSelectedIndex(i); fieldLotString.setEditable(false); break; } } } fieldLot.addActionListener(this); // New Lot Button if (asiTemplate.getMAttributeSet().getM_LotCtl_ID() > 0) { if (Env.getUserRolePermissions().isTableAccess(MLot.Table_ID, false) && Env.getUserRolePermissions().isTableAccess(MLotCtl.Table_ID, false) && !asiTemplate.isExcludeLot(m_AD_Column_ID, attributeContext.isSOTrx())) { centerPanel.add(bLot, null); bLot.addActionListener(this); } } // Popup fieldLot.addMouseListener(new VPAttributeDialog_mouseAdapter(this)); // popup mZoom = new CMenuItem(msgBL.getMsg(ctx, "Zoom"), Images.getImageIcon2("Zoom16")); mZoom.addActionListener(this); popupMenu.add(mZoom); } // Lot // // SerNo if (isPureProductASI && as.isSerNo()) { CLabel label = new CLabel(msgBL.translate(ctx, "SerNo")); label.setLabelFor(fieldSerNo); fieldSerNo.setText(asiTemplate.getSerNo()); centerPanel.add(label, new ALayoutConstraint(m_row++, 0)); centerPanel.add(fieldSerNo, null); // New SerNo Button if (asiTemplate.getMAttributeSet().getM_SerNoCtl_ID() != 0) { if (Env.getUserRolePermissions().isTableAccess(MSerNoCtl.Table_ID, false) && !asiTemplate.isExcludeSerNo(m_AD_Column_ID, attributeContext.isSOTrx())) { centerPanel.add(bSerNo, null); bSerNo.addActionListener(this); } } } // SerNo // // GuaranteeDate. // We are displaying it if we deal with a pure product ASI (i.e. user is not editing the ASI // from product window), // and if: // * the attribute set requires a GuaranteeDate // * or if the ASI has a GuaranteeDate already set if (isPureProductASI && (as.isGuaranteeDate() || asiTemplate.getGuaranteeDate() != null)) { CLabel label = new CLabel(msgBL.translate(ctx, "GuaranteeDate")); label.setLabelFor(fieldGuaranteeDate); if (isASITemplateNew) { Date guaranteeDate = asiTemplate.getGuaranteeDate(); if (guaranteeDate == null) { guaranteeDate = attributesBL.calculateBestBeforeDate( ctx, m_M_Product_ID, // product attributeContext.getC_BPartner_ID(), // vendor bpartner Env.getDate(ctx) // dateReceipt ); } fieldGuaranteeDate.setValue(guaranteeDate); } else { fieldGuaranteeDate.setValue(asiTemplate.getGuaranteeDate()); } centerPanel.add(label, new ALayoutConstraint(m_row++, 0)); centerPanel.add(fieldGuaranteeDate, null); fieldGuaranteeDateDisplayed = true; } // GuaranteeDate // Make sure we have at least something to edit or something to select, // else there is no point in showing empty this window. if (m_row == 0) { throw new AdempiereException("@PAttributeNoInfo@"); } // // New/Edit Window if (allowSelectExistingASI) { cbNewEdit.setSelected(isASITemplateNew); cmd_newEdit(); } // // Attrribute Set Instance Description { final CLabel labelDescription = new CLabel(msgBL.translate(ctx, "Description")); labelDescription.setLabelFor(fieldDescription); fieldDescription.setText(asiTemplate.getDescription()); fieldDescription.setEditable(false); centerPanel.add(labelDescription, new ALayoutConstraint(m_row++, 0)); centerPanel.add(fieldDescription, null); } // Window usually to wide (??) { final Dimension dd = centerPanel.getPreferredSize(); dd.width = Math.min(500, dd.width); centerPanel.setPreferredSize(dd); } } // initAttribute
/** * Get Instance Name * * @return Instance Name */ public String getM_AttributeSetInstanceName() { return asiEdited == null ? null : asiEdited.getDescription(); }
/** * ************************************************************************ Get Instance ID * * @return Instance ID */ public int getM_AttributeSetInstance_ID() { return asiEdited == null ? -1 : asiEdited.getM_AttributeSetInstance_ID(); } // getM_AttributeSetInstance_ID
private void fillProductTable() { int row = 0; try { String get_details = " SELECT XX_VMR_DiscountAppliDetail_ID FROM XX_VMR_DiscountAppliDetail " + " WHERE XX_VMR_DiscountRequest_ID = " + header.get_ID(); PreparedStatement pstmt = DB.prepareStatement(get_details, null); // Setting the query parameters ResultSet rs = pstmt.executeQuery(); while (rs.next()) { row = xProductTable.getRowCount(); xProductTable.setRowCount(row + 1); MVMRDiscountAppliDetail detail = new MVMRDiscountAppliDetail(Env.getCtx(), rs.getInt(1), null); IDColumn id = new IDColumn(rs.getInt(1)); id.setSelected(true); xProductTable.setValueAt(id, row, 0); MProduct prod = new MProduct(Env.getCtx(), detail.getM_Product_ID(), null); xProductTable.setValueAt(new KeyNamePair(prod.get_ID(), prod.getValue()), row, 1); xProductTable.setValueAt(prod.getKeyNamePair(), row, 3); X_XX_VMR_VendorProdRef ref_proveedor = new X_XX_VMR_VendorProdRef(Env.getCtx(), prod.getXX_VMR_VendorProdRef_ID(), null); xProductTable.setValueAt( new KeyNamePair(ref_proveedor.get_ID(), ref_proveedor.getValue()), row, 2); // Colocar el consecutivo de precio DecimalFormat formato = new DecimalFormat("000"); X_XX_VMR_PriceConsecutive priceConsecutive = new X_XX_VMR_PriceConsecutive(Env.getCtx(), detail.getXX_PriceConsecutive_ID(), null); xProductTable.setValueAt(formato.format(priceConsecutive.getXX_PriceConsecutive()), row, 4); xProductTable.setValueAt(detail.getXX_LoweringQuantity(), row, 5); xProductTable.setValueAt(detail.getXX_LoweringQuantity(), row, 6); X_XX_VMR_Category cat = new X_XX_VMR_Category(Env.getCtx(), prod.getXX_VMR_Category_ID(), null); xProductTable.setValueAt(cat.getKeyNamePair(), row, 7); X_XX_VMR_Department dep = new X_XX_VMR_Department(Env.getCtx(), header.getXX_VMR_Department_ID(), null); xProductTable.setValueAt(dep.getKeyNamePair(), row, 8); X_XX_VMR_Line lin = new X_XX_VMR_Line(Env.getCtx(), detail.getXX_VMR_Line_ID(), null); xProductTable.setValueAt(lin.getKeyNamePair(), row, 9); X_XX_VMR_Section sec = new X_XX_VMR_Section(Env.getCtx(), detail.getXX_VMR_Section_ID(), null); xProductTable.setValueAt(sec.getKeyNamePair(), row, 10); if (priceConsecutive.getM_AttributeSetInstance_ID() != 0) { MAttributeSetInstance attins = new MAttributeSetInstance( Env.getCtx(), priceConsecutive.getM_AttributeSetInstance_ID(), null); xProductTable.setValueAt( new KeyNamePair(attins.get_ID(), attins.getDescription()), row, 11); } else { xProductTable.setValueAt(new KeyNamePair(0, ""), row, 11); } } rs.close(); pstmt.close(); } catch (Exception E) { E.printStackTrace(); } }