Skip to content
Snippets Groups Projects
Commit 570e077f authored by S.Listl's avatar S.Listl
Browse files

[Projekt: Entwicklung - Neon][TicketNr.: 1034107][Vertriebsprojekt - Image...

[Projekt: Entwicklung - Neon][TicketNr.: 1034107][Vertriebsprojekt - Image soll sich auch Status zusammensetzten]
[Projekt: Entwicklung - Neon][TicketNr.: 1034098][Vertrieb - Angebot - Anschreiben ersetzt Kopf- und Fußtext]
parent 7fa06c0f
No related branches found
No related tags found
No related merge requests found
Showing
with 150 additions and 38 deletions
...@@ -85,11 +85,8 @@ ...@@ -85,11 +85,8 @@
</entityField> </entityField>
<entityField> <entityField>
<name>HEADER</name> <name>HEADER</name>
<title>Header text</title> <title>Cover letter</title>
</entityField> <contentType>HTML</contentType>
<entityField>
<name>FOOTER</name>
<title>Footer text</title>
</entityField> </entityField>
<entityConsumer> <entityConsumer>
<name>Offeritems</name> <name>Offeritems</name>
...@@ -347,6 +344,12 @@ ...@@ -347,6 +344,12 @@
</entityParameter> </entityParameter>
</children> </children>
</entityConsumer> </entityConsumer>
<entityActionField>
<name>newOrder</name>
<fieldType>ACTION</fieldType>
<title>Create receipt</title>
<onActionProcess>%aditoprj%/entity/Offer_entity/entityfields/neworder/onActionProcess.js</onActionProcess>
</entityActionField>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<dbRecordContainer> <dbRecordContainer>
...@@ -391,10 +394,6 @@ ...@@ -391,10 +394,6 @@
<name>CURRENCY.value</name> <name>CURRENCY.value</name>
<recordfield>OFFER.CURRENCY</recordfield> <recordfield>OFFER.CURRENCY</recordfield>
</dbRecordFieldMapping> </dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>FOOTER.value</name>
<recordfield>OFFER.FOOTER</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping> <dbRecordFieldMapping>
<name>HEADER.value</name> <name>HEADER.value</name>
<recordfield>OFFER.HEADER</recordfield> <recordfield>OFFER.HEADER</recordfield>
......
import("system.vars");
import("system.neon");
var params = {
"RelationId_param" : vars.getString("$field.RELATION_ID"),
"SalesprojectId_param" : vars.getString("$field.SALESPROJECT_ID"),
"OrderCurrency_param" : vars.getString("$field.CURRENCY"),
"OrderLanguage_param" : vars.getString("$field.LANGUAGE"),
"OrderHeader_param" : vars.getString("$field.HEADER"),
"OrderAddress_param" : vars.getString("$field.ADDRESS")
};
neon.openContext("Order_context", null, null, neon.OPERATINGSTATE_NEW, params);
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
<name>CURRENCY</name> <name>CURRENCY</name>
<title>Currency</title> <title>Currency</title>
<consumer>KeywordCurrencies</consumer> <consumer>KeywordCurrencies</consumer>
<valueProcess>%aditoprj%/entity/Order_entity/entityfields/currency/valueProcess.js</valueProcess>
</entityField> </entityField>
<entityField> <entityField>
<name>SALESORDERCODE</name> <name>SALESORDERCODE</name>
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
<consumer>Relations</consumer> <consumer>Relations</consumer>
<linkedContextProcess>%aditoprj%/entity/Order_entity/entityfields/relation_id/linkedContextProcess.js</linkedContextProcess> <linkedContextProcess>%aditoprj%/entity/Order_entity/entityfields/relation_id/linkedContextProcess.js</linkedContextProcess>
<mandatory v="true" /> <mandatory v="true" />
<valueProcess>%aditoprj%/entity/Order_entity/entityfields/relation_id/valueProcess.js</valueProcess>
<displayValueProcess>%aditoprj%/entity/Order_entity/entityfields/relation_id/displayValueProcess.js</displayValueProcess> <displayValueProcess>%aditoprj%/entity/Order_entity/entityfields/relation_id/displayValueProcess.js</displayValueProcess>
<onValueChange>%aditoprj%/entity/Order_entity/entityfields/relation_id/onValueChange.js</onValueChange> <onValueChange>%aditoprj%/entity/Order_entity/entityfields/relation_id/onValueChange.js</onValueChange>
<onValueChangeTypes> <onValueChangeTypes>
...@@ -58,6 +60,7 @@ ...@@ -58,6 +60,7 @@
<mandatory v="true" /> <mandatory v="true" />
<state>INVISIBLE</state> <state>INVISIBLE</state>
<stateProcess>%aditoprj%/entity/Order_entity/entityfields/salesproject_id/stateProcess.js</stateProcess> <stateProcess>%aditoprj%/entity/Order_entity/entityfields/salesproject_id/stateProcess.js</stateProcess>
<valueProcess>%aditoprj%/entity/Order_entity/entityfields/salesproject_id/valueProcess.js</valueProcess>
<displayValueProcess>%aditoprj%/entity/Order_entity/entityfields/salesproject_id/displayValueProcess.js</displayValueProcess> <displayValueProcess>%aditoprj%/entity/Order_entity/entityfields/salesproject_id/displayValueProcess.js</displayValueProcess>
</entityField> </entityField>
<entityField> <entityField>
...@@ -79,7 +82,7 @@ ...@@ -79,7 +82,7 @@
<entityField> <entityField>
<name>HEADER</name> <name>HEADER</name>
<title>Header text</title> <title>Header text</title>
<valueProcess></valueProcess> <valueProcess>%aditoprj%/entity/Order_entity/entityfields/header/valueProcess.js</valueProcess>
</entityField> </entityField>
<entityField> <entityField>
<name>FOOTER</name> <name>FOOTER</name>
...@@ -157,6 +160,7 @@ ...@@ -157,6 +160,7 @@
<consumer></consumer> <consumer></consumer>
<mandatory v="true" /> <mandatory v="true" />
<possibleItemsProcess>%aditoprj%/entity/Order_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess> <possibleItemsProcess>%aditoprj%/entity/Order_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess>
<valueProcess>%aditoprj%/entity/Order_entity/entityfields/language/valueProcess.js</valueProcess>
</entityField> </entityField>
<entityActionField> <entityActionField>
<name>newOrder</name> <name>newOrder</name>
...@@ -277,6 +281,7 @@ ...@@ -277,6 +281,7 @@
</entityConsumer> </entityConsumer>
<entityField> <entityField>
<name>ADDRESS</name> <name>ADDRESS</name>
<valueProcess>%aditoprj%/entity/Order_entity/entityfields/address/valueProcess.js</valueProcess>
</entityField> </entityField>
<entityConsumer> <entityConsumer>
<name>KeywordCurrencies</name> <name>KeywordCurrencies</name>
...@@ -308,6 +313,34 @@ ...@@ -308,6 +313,34 @@
</entityParameter> </entityParameter>
</children> </children>
</entityConsumer> </entityConsumer>
<entityParameter>
<name>OrderCurrency_param</name>
<expose v="true" />
<triggerRecalculation v="true" />
<mandatory v="false" />
<description>PARAMETER</description>
</entityParameter>
<entityParameter>
<name>OrderLanguage_param</name>
<expose v="true" />
<triggerRecalculation v="true" />
<mandatory v="false" />
<description>PARAMETER</description>
</entityParameter>
<entityParameter>
<name>OrderHeader_param</name>
<expose v="true" />
<triggerRecalculation v="true" />
<mandatory v="false" />
<description>PARAMETER</description>
</entityParameter>
<entityParameter>
<name>OrderAddress_param</name>
<expose v="true" />
<triggerRecalculation v="true" />
<mandatory v="false" />
<description>PARAMETER</description>
</entityParameter>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<dbRecordContainer> <dbRecordContainer>
......
import("system.result");
import("system.vars");
if (vars.exists("$param.OrderAddress_param"))
{
result.string(vars.get("$param.OrderAddress_param"));
}
\ No newline at end of file
import("system.result");
import("system.vars");
if (vars.exists("$param.OrderCurrency_param"))
{
result.string(vars.get("$param.OrderCurrency_param"));
}
\ No newline at end of file
import("system.result");
import("system.vars");
if (vars.exists("$param.OrderHeader_param"))
{
result.string(vars.get("$param.OrderHeader_param"));
}
\ No newline at end of file
...@@ -2,4 +2,4 @@ import("system.vars"); ...@@ -2,4 +2,4 @@ import("system.vars");
import("system.result"); import("system.result");
import("Keyword_lib"); import("Keyword_lib");
result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.get.SalesorderState, vars.getString("$field.STATUS")) ); result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.get.SalesorderState, vars.getString("$field.STATUS")) );
\ No newline at end of file
import("system.result");
import("system.vars");
if (vars.exists("$param.OrderLanguage_param"))
{
result.string(vars.get("$param.OrderLanguage_param"));
}
\ No newline at end of file
import("system.result");
import("system.vars");
if (vars.exists("$param.RelationId_param"))
{
result.string(vars.get("$param.RelationId_param"));
}
\ No newline at end of file
import("system.result");
import("system.vars");
if (vars.exists("$param.SalesprojectId_param"))
{
result.string(vars.get("$param.SalesprojectId_param"));
}
\ No newline at end of file
...@@ -309,6 +309,12 @@ ...@@ -309,6 +309,12 @@
<state>READONLY</state> <state>READONLY</state>
<valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackingsum/valueProcess.js</valueProcess> <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackingsum/valueProcess.js</valueProcess>
</entityField> </entityField>
<entityField>
<name>IMAGE</name>
<contentType>IMAGE</contentType>
<searchable v="false" />
<valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/image/valueProcess.js</valueProcess>
</entityField>
</entityFields> </entityFields>
<recordContainers> <recordContainers>
<dbRecordContainer> <dbRecordContainer>
......
import("system.vars");
import("system.result");
import("Keyword_lib");
result.string("TEXT:" + KeywordUtils.getViewValue("SALESPROJECT.STATE", vars.getString("$field.STATE")) );
\ No newline at end of file
...@@ -1533,6 +1533,12 @@ ...@@ -1533,6 +1533,12 @@
<entry> <entry>
<key>hrs</key> <key>hrs</key>
</entry> </entry>
<entry>
<key>Time expenses</key>
</entry>
<entry>
<key>Cover letter</key>
</entry>
</keyValueMap> </keyValueMap>
<font name="Dialog" style="0" size="11" /> <font name="Dialog" style="0" size="11" />
<sqlModels> <sqlModels>
......
...@@ -396,6 +396,10 @@ ...@@ -396,6 +396,10 @@
<key>standard address</key> <key>standard address</key>
<value>Standardadresse</value> <value>Standardadresse</value>
</entry> </entry>
<entry>
<key>Create receipt</key>
<value>Beleg erstellen</value>
</entry>
<entry> <entry>
<key>PP</key> <key>PP</key>
<value>EK</value> <value>EK</value>
...@@ -408,6 +412,10 @@ ...@@ -408,6 +412,10 @@
<key>Key account</key> <key>Key account</key>
<value>Großkunde</value> <value>Großkunde</value>
</entry> </entry>
<entry>
<key>Cover letter</key>
<value>Anschreiben</value>
</entry>
<entry> <entry>
<key>VAT</key> <key>VAT</key>
<value>UmsSt.</value> <value>UmsSt.</value>
......
...@@ -1559,6 +1559,12 @@ ...@@ -1559,6 +1559,12 @@
<entry> <entry>
<key>hrs</key> <key>hrs</key>
</entry> </entry>
<entry>
<key>Time expenses</key>
</entry>
<entry>
<key>Cover letter</key>
</entry>
</keyValueMap> </keyValueMap>
<font name="Dialog" style="0" size="11" /> <font name="Dialog" style="0" size="11" />
</language> </language>
...@@ -20,10 +20,6 @@ ...@@ -20,10 +20,6 @@
<name>8bf2a10e-e7e9-4f33-98cf-4ded02bf68a9</name> <name>8bf2a10e-e7e9-4f33-98cf-4ded02bf68a9</name>
<entityField>HEADER</entityField> <entityField>HEADER</entityField>
</entityFieldLink> </entityFieldLink>
<entityFieldLink>
<name>d6f2774b-34c2-4db8-9730-e98b4c83503a</name>
<entityField>FOOTER</entityField>
</entityFieldLink>
</fields> </fields>
</genericViewTemplate> </genericViewTemplate>
</children> </children>
......
...@@ -52,10 +52,6 @@ ...@@ -52,10 +52,6 @@
<name>ed71986f-303c-4118-a895-51ec31ba8775</name> <name>ed71986f-303c-4118-a895-51ec31ba8775</name>
<entityField>HEADER</entityField> <entityField>HEADER</entityField>
</entityFieldLink> </entityFieldLink>
<entityFieldLink>
<name>c4b3c8ed-4625-4785-abc6-c726171ff7f4</name>
<entityField>FOOTER</entityField>
</entityFieldLink>
<entityFieldLink> <entityFieldLink>
<name>833e6193-fde6-4990-8a26-eaeb0f60de48</name> <name>833e6193-fde6-4990-8a26-eaeb0f60de48</name>
<entityField>ChosenAddress</entityField> <entityField>ChosenAddress</entityField>
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<children> <children>
<cardViewTemplate> <cardViewTemplate>
<name>SalesprojectPreview_template</name> <name>SalesprojectPreview_template</name>
<iconField>IMAGE</iconField>
<titleField>PROJECTCODE</titleField> <titleField>PROJECTCODE</titleField>
<descriptionField>PROJECTTITLE</descriptionField> <descriptionField>PROJECTTITLE</descriptionField>
<entityField>#ENTITY</entityField> <entityField>#ENTITY</entityField>
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
<column name="SALESPROJECT_ID" type="CHAR(36)"/> <column name="SALESPROJECT_ID" type="CHAR(36)"/>
<column name="OFFER_ID" type="CHAR(36)"/> <column name="OFFER_ID" type="CHAR(36)"/>
<column name="HEADER" type="NCLOB"/> <column name="HEADER" type="NCLOB"/>
<column name="FOOTER" type="NCLOB"/>
<column name="OFFERDATE" type="DATETIME"/> <column name="OFFERDATE" type="DATETIME"/>
<column name="LANGUAGE" type="CHAR(5)"/> <column name="LANGUAGE" type="CHAR(5)"/>
<column name="OFFERCODE" type="INTEGER"/> <column name="OFFERCODE" type="INTEGER"/>
......
...@@ -97,9 +97,9 @@ OfferUtils.openOfferReport = function(pOfferID) ...@@ -97,9 +97,9 @@ OfferUtils.openOfferReport = function(pOfferID)
"OFFER.OFFERID", "OFFERITEM.OFFER_ID", "OFFERITEM.INFO", "OFFERITEM.ASSIGNEDTO", // 11 "OFFER.OFFERID", "OFFERITEM.OFFER_ID", "OFFERITEM.INFO", "OFFERITEM.ASSIGNEDTO", // 11
"OFFERITEM.PRODUCT_ID","OFFERITEM.ITEMNAME" , // 13 "OFFERITEM.PRODUCT_ID","OFFERITEM.ITEMNAME" , // 13
"OFFERITEM.OPTIONAL", "OFFERITEM.ITEMPOSITION", // 15 "OFFERITEM.OPTIONAL", "OFFERITEM.ITEMPOSITION", // 15
"PRODUCT.PRODUCTCODE", "PRODUCT.PRODUCTID", "OFFER.FOOTER", "OFFER.HEADER", "OFFERITEM.UNIT", "OFFER.VAT", // 21 "PRODUCT.PRODUCTCODE", "PRODUCT.PRODUCTID", "OFFER.HEADER", "OFFERITEM.UNIT", "OFFER.VAT", // 20
"COALESCE(OFFERITEM.QUANTITY,0)","COALESCE(OFFERITEM.PRICE,0)", "COALESCE(OFFERITEM.DISCOUNT,0)", // 24 "COALESCE(OFFERITEM.QUANTITY,0)","COALESCE(OFFERITEM.PRICE,0)", "COALESCE(OFFERITEM.DISCOUNT,0)", // 23
"COALESCE(OFFER.VERSNR, 0)", "COALESCE(OFFER.OFFERCODE,0)", "COALESCE(OFFERITEM.VAT, 0)", "0", "''", "SALESPROJECT_ID" ]; // 30 "COALESCE(OFFER.VERSNR, 0)", "COALESCE(OFFER.OFFERCODE,0)", "COALESCE(OFFERITEM.VAT, 0)", "0", "''", "SALESPROJECT_ID" ]; // 29
var offerFromSql = " from PRODUCT" var offerFromSql = " from PRODUCT"
+ " inner join OFFERITEM on (PRODUCT.PRODUCTID = OFFERITEM.PRODUCT_ID) " + " inner join OFFERITEM on (PRODUCT.PRODUCTID = OFFERITEM.PRODUCT_ID) "
...@@ -138,29 +138,29 @@ OfferUtils.openOfferReport = function(pOfferID) ...@@ -138,29 +138,29 @@ OfferUtils.openOfferReport = function(pOfferID)
// calculate: // calculate:
// "OFFERITEM_QUANTITY" * "OFFERITEM_PRICE" // "OFFERITEM_QUANTITY" * "OFFERITEM_PRICE"
fullPrice = eMath.mulDec(parseFloat(rptdata[i][22]), parseFloat(rptdata[i][23]) ); fullPrice = eMath.mulDec(parseFloat(rptdata[i][21]), parseFloat(rptdata[i][22]) );
// ( fullPrice * ( 100 - "OFFERITEM_DISCOUNT" ) ) / 100 // ( fullPrice * ( 100 - "OFFERITEM_DISCOUNT" ) ) / 100
if(optional) if(optional)
{ {
itemSum = eMath.roundDec(eMath.divDec(eMath.mulDec(fullPrice, eMath.subDec(100, rptdata[i][24]) ), 100), 2, eMath.ROUND_HALF_EVEN); //Summe je Artikel itemSum = eMath.roundDec(eMath.divDec(eMath.mulDec(fullPrice, eMath.subDec(100, rptdata[i][23]) ), 100), 2, eMath.ROUND_HALF_EVEN); //Summe je Artikel
sumItemSum += itemSum; //Gesamtsumme aller Artikel sumItemSum += itemSum; //Gesamtsumme aller Artikel
} }
// itemSum * "OFFERITEM_VAT" / 100 // itemSum * "OFFERITEM_VAT" / 100
vatsum = (eMath.divDec(eMath.mulDec(itemSum, rptdata[i][27] ), 100)); //Steuerbetrag in Euro je Artikel vatsum = (eMath.divDec(eMath.mulDec(itemSum, rptdata[i][26] ), 100)); //Steuerbetrag in Euro je Artikel
if(rptdata[i][27] > 0) sums.push([rptdata[i][27], vatsum]); //MWSteuerwerte für Map vorbereiten if(rptdata[i][26] > 0) sums.push([rptdata[i][26], vatsum]); //MWSteuerwerte für Map vorbereiten
// sumItemSum + "OFFER_VAT" // sumItemSum + "OFFER_VAT"
total = eMath.addDec(sumItemSum, rptdata[i][21]); //Gesamtsumme zzgl. MwSt. total = eMath.addDec(sumItemSum, rptdata[i][20]); //Gesamtsumme zzgl. MwSt.
total = text.formatDouble(total, translate.text("#,##0.00"), true) total = text.formatDouble(total, translate.text("#,##0.00"), true)
// format date // format date
rptdata[i][7] = datetime.toDate(rptdata[i][7], translate.text("dd.MM.yyyy", language)); rptdata[i][7] = datetime.toDate(rptdata[i][7], translate.text("dd.MM.yyyy", language));
// format numbers // format numbers
rptdata[i][23] = text.formatDouble(rptdata[i][23], translate.text("#,##0.00"), true); rptdata[i][22] = text.formatDouble(rptdata[i][22], translate.text("#,##0.00"), true);
rptdata[i][24] = text.formatDouble(rptdata[i][24], translate.text("0.00"), true); rptdata[i][23] = text.formatDouble(rptdata[i][23], translate.text("0.00"), true);
rptdata[i][22] = text.formatDouble(rptdata[i][22], translate.text("#,##0"), true); rptdata[i][21] = text.formatDouble(rptdata[i][21], translate.text("#,##0"), true);
rptdata[i][27] = text.formatDouble(rptdata[i][27], translate.text("#,##0.00"), true); rptdata[i][26] = text.formatDouble(rptdata[i][26], translate.text("#,##0.00"), true);
rptdata[i][28] = text.formatDouble(itemSum, translate.text("#,##0.00"), true); //Immer zwei Nachkommastellen und ',' statt '.' rptdata[i][27] = text.formatDouble(itemSum, translate.text("#,##0.00"), true); //Immer zwei Nachkommastellen und ',' statt '.'
rptdata[i][29] = KeywordUtils.get("UNIT", rptdata[i][20])[1]; rptdata[i][28] = KeywordUtils.get("UNIT", rptdata[i][19])[1];
} }
// TODO: get Images implementieren // TODO: get Images implementieren
...@@ -219,13 +219,13 @@ OfferUtils.openOfferReport = function(pOfferID) ...@@ -219,13 +219,13 @@ OfferUtils.openOfferReport = function(pOfferID)
data[i] = [rptdata[i][6], rptdata[i][7], rptdata[i][8], rptdata[i][10], rptdata[i][11], rptdata[i][13], data[i] = [rptdata[i][6], rptdata[i][7], rptdata[i][8], rptdata[i][10], rptdata[i][11], rptdata[i][13],
rptdata[i][14], rptdata[i][15], rptdata[i][16], rptdata[i][18], rptdata[i][19], //10 rptdata[i][14], rptdata[i][15], rptdata[i][16], rptdata[i][18], rptdata[i][19], //10
rptdata[i][22], rptdata[i][23], rptdata[i][22], rptdata[i][23],
rptdata[i][24], rptdata[i][25], rptdata[i][26], rptdata[i][27], rptdata[i][28], rptdata[i][29]]; rptdata[i][24], rptdata[i][25], rptdata[i][26], rptdata[i][27], rptdata[i][28]];
} }
// 0 1 2 3 4 // 0 1 2 3 4
offerReport.setReportData(ReportData.begin(["OFFER_CURRENCY", "OFFER_OFFERDATE", "OFFER_OFFERID", "OFFERITEM_INFO", "OFFERITEM_ASSIGNEDTO", offerReport.setReportData(ReportData.begin(["OFFER_CURRENCY", "OFFER_OFFERDATE", "OFFER_OFFERID", "OFFERITEM_INFO", "OFFERITEM_ASSIGNEDTO",
"OFFERITEM_ITEMNAME" , "OFFERITEM_OPTIONAL", "OFFERITEM_ITEMPOSITION", "PRODUCT_PRODUCTCODE", "OFFER_FOOTER", "OFFER_HEADER", // 10 "OFFERITEM_ITEMNAME" , "OFFERITEM_OPTIONAL", "OFFERITEM_ITEMPOSITION", "PRODUCT_PRODUCTCODE", "OFFER_HEADER", // 9
"OFFERITEM_QUANTITY", "OFFERITEM_PRICE", "OFFERITEM_DISCOUNT", "OFFER_VERSNR", "OFFER_OFFERCODE", "OFFERITEM_VAT", "ITEMSUM", // 17 "OFFERITEM_QUANTITY", "OFFERITEM_PRICE", "OFFERITEM_DISCOUNT", "OFFER_VERSNR", "OFFER_OFFERCODE", "OFFERITEM_VAT", "ITEMSUM", // 16
"OFFERITEM_UNITTEXT"]) // 18 "OFFERITEM_UNITTEXT"]) // 17
.add(data)); .add(data));
offerReport.openReport(); offerReport.openReport();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment