View Javadoc
1   package com.srv4pos.server.api.sync.sample;
2   
3   import com.srv4pos.server.api.ServiceFactory;
4   import com.srv4pos.server.api.category.CategoryInfo;
5   import com.srv4pos.server.api.commodity.CommodityInfo;
6   import com.srv4pos.server.api.day.DayInfo;
7   import com.srv4pos.server.api.infrastructure.credentials.Credentials;
8   import com.srv4pos.server.api.infrastructure.http.Transport;
9   import com.srv4pos.server.api.keyboard.DeviceFormFactor;
10  import com.srv4pos.server.api.keyboard.KeyboardInfo;
11  import com.srv4pos.server.api.keyboardentry.KeyAction;
12  import com.srv4pos.server.api.keyboardentry.KeyboardEntryInfo;
13  import com.srv4pos.server.api.order.OrderInfo;
14  import com.srv4pos.server.api.order.OrderItemInfo;
15  import com.srv4pos.server.api.posplus.PrintType;
16  import com.srv4pos.server.api.product.ProductInfo;
17  import com.srv4pos.server.api.product.SalesUnit;
18  import com.srv4pos.server.api.sale.*;
19  import com.srv4pos.server.api.seller.SellerInfo;
20  import com.srv4pos.server.api.sync.EntityPictureSyncAdapter;
21  import com.srv4pos.server.api.sync.EntitySyncAdapter;
22  import com.srv4pos.server.api.sync.Synchronization;
23  import com.srv4pos.server.api.tax.TaxInfo;
24  import com.srv4pos.server.api.transportation.TripInfo;
25  import com.srv4pos.server.api.treasurer.TreasurerInfo;
26  import org.apache.commons.logging.Log;
27  import org.apache.commons.logging.LogFactory;
28  import org.junit.Assert;
29  import org.junit.Test;
30  
31  import java.net.URL;
32  import java.util.*;
33  
34  
35  public class SynchronizationSample {
36  
37      private final ServiceFactory apiServiceFactory;
38  
39      private static final Log LOG = LogFactory.getLog(SynchronizationSample.class);
40  
41      public SynchronizationSample(URL url, Credentials credentials, Transport transport) {
42          apiServiceFactory = new ServiceFactory(url, credentials, transport);
43      }
44  
45      /**
46       * <p>This test is written to be used from Diagnostics.java.<br/>
47       * Test expects, that apiServiceFactory is connected to some non-empty service, which was already filled with data, contains seller,
48       * entities, etc. <br/>
49       * So, this test should be called AFTER all other tests in Diagnostics (those tests actually prepare all data
50       * and fill the remote service with required content).<br/>
51       * If test is used from somewhere else (e.g. from unit tests), it should be called after all preparation is made, at least the code,
52       * which runs before this test, should create/update/assure, that remote service has at least non-null seller info.</p>
53       *
54       * @throws Exception
55       */
56      @Test
57      public void test() throws Exception {
58  
59          MemoryLocalStorage firstClientStorage = new MemoryLocalStorage();
60          MemoryLocalStorage secondClientStorage = new MemoryLocalStorage();
61  
62          final SellerInfo sellerInfo = apiServiceFactory.getSellerService().get(null);
63          firstClientStorage.setSeller(sellerInfo);
64          secondClientStorage.setSeller(sellerInfo);
65  
66          String cashRegisterName = "testcr";
67  
68          // If test() was called from Diagnostics, server already has some data, so syncing with server to get those data
69          Assert.assertTrue("First client initial sync", doSync(firstClientStorage));
70          Assert.assertTrue("Second client initial sync", doSync(secondClientStorage));
71  
72          //LOG.warn("(1) First client storage is: " + firstClientStorage);
73          //LOG.warn("(1) Second client storage is: " + secondClientStorage);
74  
75          // Adding some data on first client
76  
77          // Taxes with "synced" flag
78          final SyncTax tax1 = new SyncTax(buildTaxInfo("Test tax 1", 12));
79          final SyncTax tax2 = new SyncTax(buildTaxInfo("Test tax 2", 24));
80          final SyncTax tax3 = new SyncTax(buildTaxInfo("Test tax 3", 30));
81          final SyncTax tax4 = firstClientStorage.getTaxByVat(25);
82  
83          firstClientStorage.add(tax1);
84          firstClientStorage.add(tax2);
85          firstClientStorage.add(tax3);
86  
87          // Products with added taxes
88          final SyncProduct product1 = new SyncProduct(buildProductInfo("P-1","Product 1", "123", 1000, SalesUnit.Price), tax1);
89          final SyncProduct product2 = new SyncProduct(buildProductInfo("P-2","Product 2", "456", 2000, SalesUnit.Price), tax1);
90          final SyncProduct product3 = new SyncProduct(buildProductInfo("P-3","Product 3", "789", 1500, SalesUnit.Kilogram), tax2);
91          final SyncProduct product4 = new SyncProduct(buildProductInfo("P-4","Product 4", "001", 3000, SalesUnit.Piece), tax2);
92          final SyncProduct product5 = new SyncProduct(buildProductInfo("P-5","Product 5", "002", 1010, SalesUnit.Kilogram), tax2);
93          final SyncProduct product6 = new SyncProduct(buildProductInfo("P-6","Product 6", "003", 5000, SalesUnit.Price), tax3);
94          final SyncProduct product7 = new SyncProduct(buildProductInfo("P-7","Product 7", "004", 1000, SalesUnit.Piece), tax4);
95          final SyncProduct product8 = new SyncProduct(buildProductInfo("P-8","Product 8", "005", 3000, SalesUnit.Piece), tax4);
96          final SyncProduct product9 = new SyncProduct(buildProductInfo("P-9","Product 9", "006", 1600, SalesUnit.Piece), tax1);
97          final SyncProduct product10 = new SyncProduct(buildProductInfo("P-10","Product 10", "007", 3000, SalesUnit.Piece), tax4);
98          final SyncProduct product11 = new SyncProduct(buildProductInfo("P-11","Product 11", "008", 1600, SalesUnit.Piece), tax1);
99  
100         // adding some pictures to few products (optional)
101         final byte[] product1PictureContentAsPNG = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // just a fake array of bytes; in real world array should have a PNG image
102         final byte[] product2PictureContentAsPNG = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
103         product1.setPictureBytes(product1PictureContentAsPNG);
104         product2.setPictureBytes(product2PictureContentAsPNG);
105 
106         firstClientStorage.add(product1);
107         firstClientStorage.add(product2);
108         firstClientStorage.add(product3);
109         firstClientStorage.add(product4);
110         firstClientStorage.add(product5);
111         firstClientStorage.add(product6);
112         firstClientStorage.add(product7);
113         firstClientStorage.add(product8);
114         firstClientStorage.add(product9);
115         firstClientStorage.add(product10);
116         firstClientStorage.add(product11);
117 
118         // Categories
119         final SyncCategory category1 = new SyncCategory(buildCategoryInfo("Category 1"));
120         final SyncCategory category2 = new SyncCategory(buildCategoryInfo("Category 2"));
121         final SyncCategory category3 = new SyncCategory(buildCategoryInfo("Category 3"));
122         final SyncCategory category4 = new SyncCategory(buildCategoryInfo("Category 4"));
123 
124         // adding picture to a category (optional)
125         final byte[] category1PictureContentAsPNG = {10, 11, 12, 13, 14};
126         category1.setPictureBytes(category1PictureContentAsPNG);
127 
128         // setting color for a category (optional)
129         category2.getInfo().setColor(0xffffff);
130 
131         firstClientStorage.add(category1);
132         firstClientStorage.add(category2);
133         firstClientStorage.add(category3);
134         firstClientStorage.add(category4);
135 
136         // Orders
137         final SyncOrder order1 = new SyncOrder(buildOrderInfo(new ArrayList<OrderItemInfo>()));
138         final SyncOrder order2 = new SyncOrder(buildOrderInfo(new ArrayList<OrderItemInfo>()));
139         final SyncOrder order3 = new SyncOrder(buildOrderInfo(new ArrayList<OrderItemInfo>()));
140         final SyncOrder order4 = new SyncOrder(buildOrderInfo(new ArrayList<OrderItemInfo>()));
141 
142         firstClientStorage.add(order1);
143         firstClientStorage.add(order2);
144         firstClientStorage.add(order3);
145         firstClientStorage.add(order4);
146 
147         // Commodity is a link between product and category (1-to-1)
148         final SyncCommodity product1commodity = new SyncCommodity(new CommodityInfo(), product1, category1); // product1 belongs to category1
149         final SyncCommodity product2commodity = new SyncCommodity(new CommodityInfo(), product2, category1); // product2 belongs to category1
150         final SyncCommodity product3commodity = new SyncCommodity(new CommodityInfo(), product3, category2); // product3 belongs to category2
151         final SyncCommodity product4commodity = new SyncCommodity(new CommodityInfo(), product4, category2); // product4 belongs to category2
152         final SyncCommodity product5commodity = new SyncCommodity(new CommodityInfo(), product5, category2); // product5 belongs to category2
153         final SyncCommodity product6commodity = new SyncCommodity(new CommodityInfo(), product6, category3); // product6 belongs to category3
154         final SyncCommodity product7commodity = new SyncCommodity(new CommodityInfo(), product7, category3); // product6 belongs to category3
155         final SyncCommodity product8commodity = new SyncCommodity(new CommodityInfo(), product8, category3); // product6 belongs to category3
156         final SyncCommodity product9commodity = new SyncCommodity(new CommodityInfo(), product9, category3); // product6 belongs to category3
157         final SyncCommodity product10commodity = new SyncCommodity(new CommodityInfo(), product10, category3); // product6 belongs to category3
158         // and category4 has no products at all (empty category)
159 
160         // adding custom colors to few products (optional)
161         product3commodity.getInfo().setColor(0xaabbcc);
162         product4commodity.getInfo().setColor(0xff00ff);
163 
164         firstClientStorage.add(product1commodity);
165         firstClientStorage.add(product2commodity);
166         firstClientStorage.add(product3commodity);
167         firstClientStorage.add(product4commodity);
168         firstClientStorage.add(product5commodity);
169         firstClientStorage.add(product6commodity);
170         firstClientStorage.add(product7commodity);
171         firstClientStorage.add(product8commodity);
172         firstClientStorage.add(product9commodity);
173         firstClientStorage.add(product10commodity);
174 
175         // adding treasurers
176         SyncTreasurer treasurer1 = new SyncTreasurer(buildTreasurerInfo("Treasurer 1", "12345"));
177         SyncTreasurer treasurer2 = new SyncTreasurer(buildTreasurerInfo("Treasurer 2", "67890"));
178         SyncTreasurer treasurer3 = new SyncTreasurer(buildTreasurerInfo("Supervisor", "32456123"));
179         firstClientStorage.add(treasurer1);
180         firstClientStorage.add(treasurer2);
181         firstClientStorage.add(treasurer3);
182 
183         //adding keyboards
184         SyncKeyboard keyboard1 = new SyncKeyboard(buildKeyboardInfo("Keyboard 1", 9, 4, DeviceFormFactor.PHONE));
185         SyncKeyboard keyboard2 = new SyncKeyboard(buildKeyboardInfo("Keyboard 2", 12, 6, DeviceFormFactor.TABLET_SMALL));
186         SyncKeyboard keyboard3 = new SyncKeyboard(buildKeyboardInfo("Keyboard 3", 15, 8, DeviceFormFactor.TABLET_BIG));
187         firstClientStorage.add(keyboard1);
188         firstClientStorage.add(keyboard2);
189         firstClientStorage.add(keyboard3);
190 
191         //adding keyboard entries
192         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(0, 0, 1, 1, KeyAction.InitSaleCash), keyboard1, null));
193         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(1, 0, 2, 1, KeyAction.Product), keyboard1, product1));
194         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(0, 0, 1, 1, KeyAction.InitSaleCash), keyboard2, null));
195         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(0, 1, 2, 1, KeyAction.Product), keyboard2, product2));
196         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(0, 0, 1, 1, KeyAction.InitSaleCash), keyboard3, null));
197         firstClientStorage.add(new SyncKeyboardEntry(buildKeyboardEntryInfo(0, 0, 1, 1, KeyAction.GetOrders), keyboard3, null));
198 
199         //adding sale slots
200         firstClientStorage.add(new SyncSaleSlot(buildSaleSlotInfo("Sale slot 1"), false));
201         firstClientStorage.add(new SyncSaleSlot(buildSaleSlotInfo("Sale slot 1"), false));
202         firstClientStorage.add(new SyncSaleSlot(buildSaleSlotInfo("Sale slot 1"), false));
203         firstClientStorage.add(new SyncSaleSlot(buildSaleSlotInfo("Sale slot 1"), false));
204 
205         //adding days
206         Calendar calendar = Calendar.getInstance();
207         calendar.set(Calendar.HOUR_OF_DAY, 9);
208 
209         Date open1 = calendar.getTime();
210         calendar.add(Calendar.HOUR_OF_DAY, 8);
211         Date close1 = calendar.getTime();
212         SyncDay day1 = new SyncDay(buildDayInfo(cashRegisterName, 10000, close1, 1, open1), treasurer1);
213 
214         calendar.add(Calendar.HOUR_OF_DAY, 16);
215         Date open2 = calendar.getTime();
216         calendar.add(Calendar.HOUR_OF_DAY, 8);
217         Date close2 = calendar.getTime();
218         SyncDay day2 = new SyncDay(buildDayInfo(cashRegisterName, 20000, close2, 2, open2), treasurer2);
219 
220         calendar.add(Calendar.HOUR_OF_DAY, 16);
221         Date open3 = calendar.getTime();
222         SyncDay day3 = new SyncDay(buildDayInfo(cashRegisterName, 30000, null, 3, open3), null);
223 
224         firstClientStorage.add(day1);
225         firstClientStorage.add(day2);
226         firstClientStorage.add(day3);
227 
228         //adding trips
229         TripInfo tripInfo1 = buildTripInfo(cashRegisterName, 1, "0001", "01");
230         SyncTrip trip1 = new SyncTrip(tripInfo1);
231         SyncTrip trip2 = new SyncTrip(buildTripInfo(cashRegisterName, 2, "0002", "02"));
232         firstClientStorage.add(trip1);
233         firstClientStorage.add(trip2);
234 
235         //adding sales
236         List<SaleProductInfo> saleProducts = new ArrayList<SaleProductInfo>();
237         saleProducts.add(buildSaleProductInfo(0, 0, open1, 200, true,
238                 2500, 2500, 0, 2375, 2000, 1250,
239                 500, 2500, product7));
240         saleProducts.add(buildSaleProductInfo(0, 500, open1, 200, true,
241                 7500, 7125, 375, 6769, 5700, 3750,
242                 1425, 2500, product8));
243         saleProducts.add(buildSaleProductInfo(1000, 0, open1, 200, true,
244                 3584, 2584, 1000, 2455, 2307, 1792,
245                 277, 1200, product9));
246         List<VatRateSumInfo> vatRateSums = new ArrayList<VatRateSumInfo>();
247         vatRateSums.add(buildVatRateSum(9625, 7700, 1925,
248                 9231, 7385, 1846, 2500));
249         vatRateSums.add(buildVatRateSum(2584, 2307, 277,
250                 2478, 2213, 265, 1200));
251         List<PaymentInfo> payments = new ArrayList<PaymentInfo>();
252         payments.add(buildPaymentInfo(11709, PaymentType.AirPay));
253         List<PrintInfo> prints = new ArrayList<PrintInfo>();
254         prints.add(buildPrintInfo(1, PrintType.Normal, "0000001", DeliveryType.Print, open1.getTime()));
255         SyncSale sale1 = new SyncSale(buildSaleInfo(cashRegisterName, 1, saleProducts, payments, prints, 500, 0,
256                 11709, sellerInfo.getIdentifier(), 12209, 500, 2111, vatRateSums, "000001", tripInfo1.getIdentifier()),
257                 treasurer1, day3, trip1);
258 
259         saleProducts = new ArrayList<SaleProductInfo>();
260         saleProducts.add(buildSaleProductInfo(0, 0, open2, 200, true,
261                 2500, 2500, 0, 2375, 2000, 1250, 500,
262                 2500, product7));
263         saleProducts.add(buildSaleProductInfo(0, 500, open2, 200, true,
264                 7500, 7125, 375, 6769, 5700, 3750, 1425,
265                 2500, product8));
266         saleProducts.add(buildSaleProductInfo(1000, 0, open2, 200, true,
267                 3584, 2584, 1000, 2455, 2307, 1792, 277,
268                 1200, product9));
269         vatRateSums = new ArrayList<VatRateSumInfo>();
270         vatRateSums.add(buildVatRateSum(9625, 7700, 1925,
271                 9144, 7315, 1829, 2500));
272         vatRateSums.add(buildVatRateSum(2584, 2307, 277,
273                 2455, 2192, 263, 1200));
274         payments = new ArrayList<PaymentInfo>();
275         payments.add(buildPaymentInfo(11599, PaymentType.Cash));
276         prints = new ArrayList<PrintInfo>();
277         prints.add(buildPrintInfo(2, PrintType.Normal, "00000002", DeliveryType.Print, open2.getTime()));
278         prints.add(buildPrintInfo(3, PrintType.Copy, "00000002", DeliveryType.SMS, open2.getTime()));
279         SyncSale sale2 = new SyncSale(buildSaleInfo(cashRegisterName, 2, saleProducts, payments, prints, 0, 500,
280                 11599, sellerInfo.getIdentifier(), 12209, 610, 2092, vatRateSums, "000001", tripInfo1.getIdentifier()),
281                 treasurer2, day3, trip1);
282 
283         saleProducts = new ArrayList<SaleProductInfo>();
284         saleProducts.add(buildSaleProductInfo(0, 0, open3, 2000, false,
285                 2000, 2000, 0, 1796, 1786, 1120, 214,
286                 1200, product1));
287         saleProducts.add(buildSaleProductInfo(0, 500, open3, 2000, false,
288                 2000, 1900, 100, 1706, 1520, 3750, 380,
289                 2500, product10));
290         saleProducts.add(buildSaleProductInfo(1000, 0, open3, 2000, false,
291                 2000, 1000, 1000, 898, 893, 1792, 107,
292                 1200, product11));
293         vatRateSums = new ArrayList<VatRateSumInfo>();
294         vatRateSums.add(buildVatRateSum(1900, 1520, 380,
295                 1706, 1365, 341, 2500));
296         vatRateSums.add(buildVatRateSum(3000, 2679, 321,
297                 2694, 2405, 289, 1200));
298         payments = new ArrayList<PaymentInfo>();
299         payments.add(buildPaymentInfo(4400, PaymentType.EmvIntegrated));
300         prints.add(buildPrintInfo(4, PrintType.Normal, "00000003", DeliveryType.Print, open3.getTime()));
301         SyncSale sale3 = new SyncSale(buildSaleInfo(cashRegisterName, 3, saleProducts, payments, prints, 500, 0,
302                 4400, sellerInfo.getIdentifier(), 4900, 500, 630, vatRateSums, "000001", null),
303                 treasurer3, day3, null);
304 
305         firstClientStorage.add(sale1);
306         firstClientStorage.add(sale2);
307         firstClientStorage.add(sale3);
308 
309         trip1.setSales(Arrays.asList(sale1, sale2));
310 
311         Assert.assertTrue("Syncing first client to upload added data to the server", doSync(firstClientStorage));
312 
313         Assert.assertTrue("Syncing second client to get added data from server", doSync(secondClientStorage));
314 
315         // TODO RI: temporary
316         //Assert.assertTrue("Sync was successful: data on clients are equal", firstClientStorage.isEqualTo(secondClientStorage));
317 
318         // deleting first tax (we have at least one, because just added a tax)
319         //final SyncTax tax = secondClientStorage.getTaxes().get(0);
320         //tax.setSynced(false);
321         //tax.getInfo().setDeleted(true);
322 
323         //Assert.assertTrue("Second client sync to delete first tax", doSync(secondClientStorage));
324         //Assert.assertTrue("First client sync to get updated tax list", doSync(firstClientStorage));
325 
326         //LOG.warn("(3) First client storage is: " + firstClientStorage);
327         //LOG.warn("(3) Second client storage is: " + secondClientStorage);
328 
329         //Assert.assertTrue("(3) Storages for both clients are equal", firstClientStorage.isEqualTo(secondClientStorage));
330     }
331 
332     private boolean doSync(MemoryLocalStorage storage) {
333         final Map<Class, EntitySyncAdapter> syncAdapters = new HashMap<Class, EntitySyncAdapter>(6);
334         final Map<Class, EntityPictureSyncAdapter> pictureSyncAdapters = new HashMap<Class, EntityPictureSyncAdapter>(2);
335 
336         syncAdapters.put(SellerInfo.class, new SellerSyncAdapter(storage));
337         syncAdapters.put(TaxInfo.class, new TaxSyncAdapter(storage));
338         syncAdapters.put(CategoryInfo.class, new CategorySyncAdapter(storage));
339         syncAdapters.put(ProductInfo.class, new ProductSyncAdapter(storage));
340         syncAdapters.put(CommodityInfo.class, new CommoditySyncAdapter(storage));
341         syncAdapters.put(TreasurerInfo.class, new TreasurerSyncAdapter(storage));
342         syncAdapters.put(OrderInfo.class, new OrderSyncAdapter(storage));
343         syncAdapters.put(KeyboardInfo.class, new KeyboardSyncAdapter(storage));
344         syncAdapters.put(KeyboardEntryInfo.class, new KeyboardEntrySyncAdapter(storage));
345         syncAdapters.put(SaleSlotInfo.class, new SaleSlotSyncAdapter(storage));
346         syncAdapters.put(DayInfo.class, new DaySyncAdapter(storage));
347         syncAdapters.put(TripInfo.class, new TripSyncAdapter(storage));
348         syncAdapters.put(SaleInfo.class, new SaleSyncAdapter(storage));
349 
350         pictureSyncAdapters.put(ProductInfo.class, new ProductPictureSyncAdapter(storage));
351         pictureSyncAdapters.put(CategoryInfo.class, new CategoryPictureSyncAdapter(storage));
352         pictureSyncAdapters.put(SaleSlotInfo.class, new SaleSlotPictureSyncAdapter(storage));
353 
354         return Synchronization.sync(
355                 storage.getSyncInfo(),
356                 apiServiceFactory,
357                 syncAdapters,
358                 pictureSyncAdapters
359         );
360     }
361 
362     private TaxInfo buildTaxInfo(String name, int vat) {
363         TaxInfo taxInfo = new TaxInfo();
364 
365         taxInfo.setName(name);
366         taxInfo.setVat(vat);
367 
368         return taxInfo;
369     }
370 
371     private ProductInfo buildProductInfo(String identifier, String name, String barcode, long netto, SalesUnit salesUnit) {
372         final ProductInfo productInfo = new ProductInfo();
373 
374         productInfo.setIdentifier(identifier);
375         productInfo.setName(name);
376         productInfo.setBarcode(barcode);
377         productInfo.setNetto(netto);
378         productInfo.setSalesUnit(salesUnit);
379 
380         return productInfo;
381     }
382 
383     private CategoryInfo buildCategoryInfo(String name) {
384         final CategoryInfo categoryInfo = new CategoryInfo();
385 
386         categoryInfo.setName(name);
387 
388         return categoryInfo;
389     }
390 
391     private TreasurerInfo buildTreasurerInfo(final String name, final String ssn) {
392         final TreasurerInfo treasurerInfo = new TreasurerInfo();
393 
394         treasurerInfo.setName(name);
395         treasurerInfo.setSsn(ssn);
396         treasurerInfo.setIdentifier(ssn);
397 
398         return treasurerInfo;
399     }
400 
401     private OrderInfo buildOrderInfo(List<OrderItemInfo> orderItemInfos) {
402         final OrderInfo orderInfo = new OrderInfo();
403 
404         orderInfo.setOrderItems(orderItemInfos);
405 
406         return orderInfo;
407     }
408 
409     private KeyboardInfo buildKeyboardInfo(String name, int width, int height, DeviceFormFactor deviceFormFactor) {
410         final KeyboardInfo keyboardInfo = new KeyboardInfo();
411 
412         keyboardInfo.setName(name);
413         keyboardInfo.setWidth(width);
414         keyboardInfo.setHeight(height);
415         keyboardInfo.setDeviceFormFactor(deviceFormFactor);
416 
417         return keyboardInfo;
418     }
419 
420     private KeyboardEntryInfo buildKeyboardEntryInfo(int positionX, int positionY, int width, int height, KeyAction action) {
421         final KeyboardEntryInfo keyboardEntryInfo = new KeyboardEntryInfo();
422 
423         keyboardEntryInfo.setPositionX(positionX);
424         keyboardEntryInfo.setPositionY(positionY);
425         keyboardEntryInfo.setWidth(width);
426         keyboardEntryInfo.setHeight(height);
427         keyboardEntryInfo.setKeyAction(action);
428         keyboardEntryInfo.setLabel(action.name());
429 
430         return keyboardEntryInfo;
431     }
432 
433     private SaleSlotInfo buildSaleSlotInfo(String name) {
434         final SaleSlotInfo saleSlotInfo = new SaleSlotInfo();
435 
436         saleSlotInfo.setName(name);
437 
438         return saleSlotInfo;
439     }
440 
441     private DayInfo buildDayInfo(String cashRegisterName, long cash, Date close, int dayNumber, Date open) {
442         final DayInfo dayInfo = new DayInfo();
443         dayInfo.setCash(cash);
444         dayInfo.setCashAtClose(cash);
445         dayInfo.setCashRegisterName(cashRegisterName);
446         dayInfo.setClose(close);
447         dayInfo.setDayNumber(dayNumber);
448         dayInfo.setOpen(open);
449         dayInfo.setOpened(close == null);
450         dayInfo.setModified(new Date());
451         return dayInfo;
452     }
453 
454     private SaleProductInfo buildSaleProductInfo(long absoluteDiscount, int relativeDiscount, Date created, long delta,
455                                                  boolean isDeltaUnit, long vanillaBrutto, long brutto, long discount,
456                                                  long effectiveBrutto, long netto, long productBrutto, long vat,
457                                                  long vatRate, SyncProduct original) {
458         SaleProductInfo saleProduct = new SaleProductInfo();
459         saleProduct.setAbsoluteDiscount(absoluteDiscount);
460         saleProduct.setRelativeDiscount(relativeDiscount);
461         saleProduct.setCreated(created);
462         saleProduct.setDelta(delta);
463         saleProduct.setDeltaUnit(isDeltaUnit);
464         saleProduct.setVanillaBrutto(vanillaBrutto);
465         saleProduct.setBrutto(brutto);
466         saleProduct.setDiscount(discount);
467         saleProduct.setEffectiveBrutto(effectiveBrutto);
468         saleProduct.setNetto(netto);
469         saleProduct.setProductBrutto(productBrutto);
470         saleProduct.setVat(vat);
471         saleProduct.setVatRate(vatRate);
472         saleProduct.setProductIdentifier(original.getInfo().getIdentifier());
473         return saleProduct;
474     }
475 
476     private PaymentInfo buildPaymentInfo(int amount, PaymentType paymentType) {
477         PaymentInfo payment = new PaymentInfo();
478         payment.setAmount(amount);
479         payment.setPaymentState(PaymentState.APPROVED);
480         payment.setPaymentType(paymentType);
481         return payment;
482     }
483 
484     private PrintInfo buildPrintInfo(int receiptNumber, PrintType printType, String controlCode, DeliveryType deliveryType, long created) {
485         PrintInfo print = new PrintInfo();
486         print.setReceiptNumber(receiptNumber);
487         print.setPrintType(printType);
488         print.setControlNumber(controlCode);
489         print.setDeliveryType(deliveryType);
490         print.setCreated(new Date(created));
491         return print;
492     }
493 
494     private VatRateSumInfo buildVatRateSum(long vanillaBrutto, long vanillaNetto, long vanillaVat,
495                                            long brutto, long netto, long vat, Integer vatRate) {
496         VatRateSumInfo vateRateSum = new VatRateSumInfo();
497         vateRateSum.setVanillaBrutto(vanillaBrutto);
498         vateRateSum.setVanillaNetto(vanillaNetto);
499         vateRateSum.setVanillaVat(vanillaVat);
500         vateRateSum.setBrutto(brutto);
501         vateRateSum.setNetto(netto);
502         vateRateSum.setVat(vat);
503         vateRateSum.setVatRate(vatRate);
504         return vateRateSum;
505     }
506 
507     private SaleInfo buildSaleInfo(String cashRegisterName, int receiptNumber, List<SaleProductInfo> saleProducts, List<PaymentInfo> payments, List<PrintInfo> prints,
508                                    long absoluteDiscount, int relativeDiscount, long brutto, String sellerIdentifier,
509                                    long vanillaBrutto, long discount, long vat, List<VatRateSumInfo> vatRateSums,
510                                    String controlUnitId, String tripIdentifier) {
511         final SaleInfo saleInfo = new SaleInfo();
512         saleInfo.setIdentifier(String.format("%1$s-%2$d", cashRegisterName, receiptNumber));
513         saleInfo.setSaleProducts(saleProducts);
514         saleInfo.setPayments(payments);
515         saleInfo.setPrints(prints);
516         saleInfo.setAbsoluteDiscount(absoluteDiscount);
517         saleInfo.setRelativeDiscount(relativeDiscount);
518         saleInfo.setBrutto(brutto);
519         saleInfo.setSaleState(SaleState.Paid);
520         saleInfo.setSellerIdentifier(sellerIdentifier);
521         saleInfo.setVanillaBrutto(vanillaBrutto);
522         saleInfo.setDiscount(discount);
523         saleInfo.setVat(vat);
524         saleInfo.setVatRateSums(vatRateSums);
525         saleInfo.setControlUnitId(controlUnitId);
526         saleInfo.setTripIdentifier(tripIdentifier);
527         return saleInfo;
528     }
529 
530     private TripInfo buildTripInfo(String cashRegisterName, int index, String routeCode, String tripCode) {
531         TripInfo tripInfo = new TripInfo();
532         tripInfo.setIdentifier(String.format("%1$s-%2$d", cashRegisterName, index));
533         tripInfo.setRouteCode(routeCode);
534         tripInfo.setTripCode(tripCode);
535         return tripInfo;
536     }
537 }
538