diff --git a/.gitignore b/.gitignore index 6914c101c3b43acda41c9a92f4aa4c9e996093e7..ac7024a75ece79ea286133ad44923eafd64e9dc6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ tests/local.properties app/build build -app/account.gradle +account.gradle app/keystore.properties app/keystore diff --git a/app/src/androidTest/java/fr/pasteque/client/PdfCreatorActivityTest.java b/app/src/androidTest/java/fr/pasteque/client/PdfCreatorActivityTest.java new file mode 100644 index 0000000000000000000000000000000000000000..10d3b670e87953ae6755542fc6374455e312f98b --- /dev/null +++ b/app/src/androidTest/java/fr/pasteque/client/PdfCreatorActivityTest.java @@ -0,0 +1,45 @@ +package fr.pasteque.client; + +import android.content.Intent; +import android.test.ActivityInstrumentationTestCase2; +import fr.pasteque.client.activities.PdfCreatorActivity; +import fr.pasteque.client.data.Data; +import fr.pasteque.client.models.Receipt; +import fr.pasteque.client.utils.file.InternalFile; +import fr.pasteque.client.widgets.pdf.Pdf; + +import java.io.FileOutputStream; +import java.util.List; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 16:48. + */ +public class PdfCreatorActivityTest extends ActivityInstrumentationTestCase2 { + + public PdfCreatorActivityTest() { + super(PdfCreatorActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + List receiptList = Data.Receipt.getReceipts(null); + Intent intent = new Intent().putExtra(PdfCreatorActivity.TICKET_TAG, receiptList.get(1).getTicket()); + setActivityIntent(intent); + } + + public void testPdf() throws Throwable { + final Pdf pdf = getActivity().getPdf(); + runTestOnUiThread(new Runnable() { + @Override + public void run() { + try { + pdf.build(new FileOutputStream(new InternalFile("aPdf.pdf"))); + } catch (Exception e) { + fail(); + } + } + }); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e97c9893f1462e53a4fd8d448f32e045b6510c1..f3569f8496cd55d586a5e53f2c9b32e6c005dd77 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,8 @@ + + 0) { + out.write(buf, 0, len); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + in.close(); + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } + + private InternalFile createPdf() { + String filename = "invoice_" + UUID.randomUUID() + ".pdf"; + InternalFile internalFile = null; + try { + internalFile = new InternalFile(PDF_DIRECTORY, filename, Context.MODE_WORLD_READABLE); + FileOutputStream fileOutputStream = internalFile.openWrite(); + getPdf().build(fileOutputStream); + + } catch (FileNotFoundException | CouldNotCreatePdfException e) { + e.printStackTrace(); + Pasteque.Toast.show(R.string.err_create_pdf); + } + return internalFile; + } + + private void createCustomer() { + CustomerInfoDialog customerInfoDialog = CustomerInfoDialog.newInstance(true, null); + customerInfoDialog.setDialogCustomerListener(this); + customerInfoDialog.show(getFragmentManager()); + } + + private void editCustomer() { + CustomerInfoDialog customerInfoDialog = CustomerInfoDialog.newInstance(true, this.customer); + customerInfoDialog.setDialogCustomerListener(this); + customerInfoDialog.show(getFragmentManager()); + } + + private CompanyView outerCompany; + + @Override + public void onCreate(Bundle state) { + super.onCreate(state); + Bundle bundle = getIntent().getExtras(); + if (bundle != null) { + Ticket ticket = (Ticket) bundle.getSerializable(PdfCreatorActivity.TICKET_TAG); + if (ticket != null) { + this.customer = ticket.getCustomer(); + fillInvoice(ticket); + } + } + } + + private void fillInvoice(Ticket ticket) { + setContentView(R.layout.pdf_invoice_viewer); + ((CompanyView) findViewById(R.id.inner_company)).setCompany(Pasteque.getCompany()); + outerCompany = (CompanyView) findViewById(R.id.outer_company); + if (ticket.getCustomer() != null) { + outerCompany.setCompany(ticket.getCustomer().getCompany()); + } else { + outerCompany.setListener(this.addCustomerListener); + outerCompany.noCompany(); + } + fillLines(ticket.getLines()); + fillTaxes(ticket); + fillTotal(ticket); + } + + private void fillTotal(Ticket ticket) { + TableLayout content = (TableLayout) findViewById(R.id.ticket); + addTotalHeader(content); + addDivider(content); + PdfTotalRow row = new PdfTotalRow(getApplicationContext(), content); + row.setTotal(ticket); + } + + private void addTotalHeader(TableLayout content) { + PdfTotalRow row = new PdfTotalRow(getApplicationContext(), content); + TableLayout.LayoutParams params = (TableLayout.LayoutParams) row.getLayoutParams(); + params.setMargins(0, HEADER_PADDING, 0, HEADER_PADDING); + row.setHeader(); + } + + private void fillTaxes(Ticket ticket) { + TableLayout content = (TableLayout) findViewById(R.id.ticket); + addTaxesHeader(content); + addDivider(content); + Map taxeValue = ticket.getTaxes(); + Map excByTaxes = ticket.getExcByTaxes(); + for (Double taxe : taxeValue.keySet()) { + PdfTaxeRow row = new PdfTaxeRow(getApplicationContext(), content); + row.setTaxe(taxe, taxeValue.get(taxe), excByTaxes.get(taxe)); + } + } + + private void addDivider(TableLayout content) { + getLayoutInflater().inflate(R.layout.pdf_divider, content, true); + } + + private void addTaxesHeader(TableLayout content) { + PdfTaxeRow row = new PdfTaxeRow(getApplicationContext(), content); + TableLayout.LayoutParams params = (TableLayout.LayoutParams) row.getLayoutParams(); + params.setMargins(0, HEADER_PADDING, 0, HEADER_PADDING); + row.setHeader(); + } + + private void fillLines(List lines) { + TableLayout content = (TableLayout) findViewById(R.id.ticket); + addLinesHeader(content); + addDivider(content); + for (TicketLine each : lines) { + PdfTicketRow row = new PdfTicketRow(getApplicationContext(), content); + row.setTicket(each); + } + } + + private void addLinesHeader(TableLayout content) { + PdfTicketRow row = new PdfTicketRow(getApplicationContext(), content); + row.setHeader(); + } + + public Pdf getPdf() { + return (Pdf) findViewById(R.id.pdf); + } + + @Override + public void onCustomerPicked(Customer customer) { + this.customer = customer; + if (customer != null) { + outerCompany.setCompany(customer.getCompany()); + } else { + outerCompany.setCompany(null); + } + } + + @Override + public void onCustomerCreated(Customer customer) { + this.customer = customer; + outerCompany.setCompany(customer.getCompany()); + } +} diff --git a/app/src/main/java/fr/pasteque/client/data/DataSavable/AbstractJsonDataSavable.java b/app/src/main/java/fr/pasteque/client/data/DataSavable/AbstractJsonDataSavable.java index df31b1e805468b1da2292d1173dcd98f0dbf3e97..6715619d3c51d5cb60ea505305deda240ed3d55a 100644 --- a/app/src/main/java/fr/pasteque/client/data/DataSavable/AbstractJsonDataSavable.java +++ b/app/src/main/java/fr/pasteque/client/data/DataSavable/AbstractJsonDataSavable.java @@ -40,6 +40,12 @@ public abstract class AbstractJsonDataSavable extends AbstractDataSavable { @Override public void load(Context ctx) throws DataCorruptedException, IOError { + File file = this.file; + List result = getObjects(file); + this.recoverObjects(result); + } + + public List getObjects(File file) throws DataCorruptedException { int objectsNumber = getNumberOfObjects(); List classes = getClassList(); List result = new ArrayList<>(); @@ -60,7 +66,7 @@ public abstract class AbstractJsonDataSavable extends AbstractDataSavable { if (result.size() != getObjectList().size()) { throw newException(null, stringFile); } - this.recoverObjects(result); + return result; } @Override diff --git a/app/src/main/java/fr/pasteque/client/fragments/CustomerInfoDialog.java b/app/src/main/java/fr/pasteque/client/fragments/CustomerInfoDialog.java index 47a3fc4e81fb7331fcbd641f520137f65f64e4b8..604fbf902e74d0cae9b795ed4b80f0399d8948a0 100644 --- a/app/src/main/java/fr/pasteque/client/fragments/CustomerInfoDialog.java +++ b/app/src/main/java/fr/pasteque/client/fragments/CustomerInfoDialog.java @@ -268,11 +268,38 @@ public class CustomerInfoDialog extends DialogFragment @Override public void onClick(View v) { - //TODO: Handle customer edition if (!mbEditable) { getDialog().dismiss(); return; } + try { + Customer customer; + if (this.mCustomer != null) { + customer = editCustomer(); + } else { + customer = createCustomer(); + } + if (customer != null) { + send(customer); + } + } catch (NotConformException ignore){ + + } + } + + private Customer editCustomer() throws NotConformException { + throw new NotConformException(); + } + + private void send(Customer customer) { + if (Configure.getSyncMode(mCtx) == Configure.AUTO_SYNC_MODE) { + uploadCustomer(customer); + } else { + storeLocalCustomer(customer); + } + } + + private Customer createCustomer() throws NotConformException { String firstNameStr = mName.getText().toString(); String lastNameStr = mName.getText().toString(); String address1Str = ""; @@ -300,12 +327,9 @@ public class CustomerInfoDialog extends DialogFragment address2Str, zipCodeStr, cityStr, departmentStr, countryStr, mailStr, phone1Str, phone2Str, faxStr, 0.0, 0.0, 0.0, "0", noteStr); - if (Configure.getSyncMode(mCtx) == Configure.AUTO_SYNC_MODE) { - uploadCustomer(c); - } else { - storeLocalCustomer(c); - } + return c; } + throw new NotConformException(); } private boolean isEmailValid(CharSequence email) { @@ -499,4 +523,7 @@ public class CustomerInfoDialog extends DialogFragment b.show(); } } + + private class NotConformException extends Throwable { + } } diff --git a/app/src/main/java/fr/pasteque/client/models/Address.java b/app/src/main/java/fr/pasteque/client/models/Address.java new file mode 100644 index 0000000000000000000000000000000000000000..374463b150d3a6f2090ca98ade328e8a69e76179 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/Address.java @@ -0,0 +1,26 @@ +package fr.pasteque.client.models; + +import java.io.Serializable; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 15:39. + */ +public class Address implements Serializable{ + + public String address = ""; + public String postCode = ""; + public String city = ""; + public String country = ""; + + public Address() { + + } + + public Address(String address, String postCode, String city, String country) { + this.address = address; + this.postCode = postCode; + this.country = country; + this.city = city; + } +} diff --git a/app/src/main/java/fr/pasteque/client/models/Company.java b/app/src/main/java/fr/pasteque/client/models/Company.java new file mode 100644 index 0000000000000000000000000000000000000000..d649e1cf8558b915206e8e092fb3c38f7c849b99 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/Company.java @@ -0,0 +1,17 @@ +package fr.pasteque.client.models; + +import java.io.Serializable; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 15:40. + */ +public class Company implements Serializable { + + public String name; + public Address address; + public String siret; + public String naf; + public String tvaNumber; + +} diff --git a/app/src/main/java/fr/pasteque/client/models/Customer.java b/app/src/main/java/fr/pasteque/client/models/Customer.java index 8153c6925d6336c61013fef4c342e68a26244e2f..81e767cd382af0dd62023980f18227cdd2bf48db 100644 --- a/app/src/main/java/fr/pasteque/client/models/Customer.java +++ b/app/src/main/java/fr/pasteque/client/models/Customer.java @@ -214,4 +214,15 @@ public class Customer implements Serializable { public boolean equals(Object o) { return (o instanceof Customer) && this.id.equals(((Customer)o).id); } + + public Company getCompany() { + Company result = new Company(); + result.address = new Address(); + result.name = this.name; + result.address.address = this.address1; + result.address.city = this.city; + result.address.country = this.country; + result.address.postCode = this.zipCode; + return result; + } } diff --git a/app/src/main/java/fr/pasteque/client/models/Ticket.java b/app/src/main/java/fr/pasteque/client/models/Ticket.java index c6662ddb2be4b236093f6fefd1b0998b62027311..1dcc072ff6c05207178387b72b7ad016a29a5e96 100644 --- a/app/src/main/java/fr/pasteque/client/models/Ticket.java +++ b/app/src/main/java/fr/pasteque/client/models/Ticket.java @@ -18,14 +18,14 @@ package fr.pasteque.client.models; import java.io.Serializable; -import java.text.SimpleDateFormat; import java.util.*; +import java.util.Date; import fr.pasteque.client.Configure; import fr.pasteque.client.Pasteque; import fr.pasteque.client.data.Data; import fr.pasteque.client.sync.TicketUpdater; -import fr.pasteque.client.utils.CalculPrice; +import fr.pasteque.client.utils.*; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -41,7 +41,6 @@ import android.util.Log; */ public class Ticket implements Serializable { - private static final String DATE_FORMAT = "HH:mm:ss"; private String id; // private String ticketId; private int articles; @@ -152,7 +151,7 @@ public class Ticket implements Serializable { if (this.label != null) { return label; } - return new SimpleDateFormat(DATE_FORMAT).format(creationTime); + return new fr.pasteque.client.utils.Date(creationTime).formatTime(); } public TariffArea getTariffArea() { @@ -325,7 +324,7 @@ public class Ticket implements Serializable { } public Map getTaxes() { - Map taxes = new HashMap(); + Map taxes = new TreeMap<>(); for (TicketLine l : this.lines) { double rate = l.getProduct().getTaxRate(); double amount = l.getTotalTaxCost(this.discountRate); @@ -337,6 +336,19 @@ public class Ticket implements Serializable { return taxes; } + public Map getExcByTaxes() { + Map taxes = new TreeMap(); + for (TicketLine l : this.lines) { + double rate = l.getProduct().getTaxRate(); + double amount = l.getTotalDiscPExcTax(); + if (taxes.containsKey(rate)) { + amount += taxes.get(rate); + } + taxes.put(rate, amount); + } + return taxes; + } + public String getTicketId() { return this.ticketId; } @@ -554,6 +566,14 @@ public class Ticket implements Serializable { _addTicketLine(refundLine); } + public double getTicketTax() { + double result = 0; + for (Double each : getTaxes().values()) { + result += each; + } + return result; + } + protected static class TicketInstance { public Ticket newTicket(String id, String label) { return new Ticket(id, label); diff --git a/app/src/main/java/fr/pasteque/client/models/document/Cashing.java b/app/src/main/java/fr/pasteque/client/models/document/Cashing.java new file mode 100644 index 0000000000000000000000000000000000000000..8df07ad0bf86622c0f99888c829c0504d7bab9aa --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Cashing.java @@ -0,0 +1,20 @@ +package fr.pasteque.client.models.document; + +/** + * Created by svirch_n on 25/04/16 + * This class is made from the NF-525 convention + * A cashing is a tickeline sum of TVA + * Last edited at 15:03. + */ +public class Cashing { + + public String id; + public String documentId; + public int htSum; + public String tvaCode; + public int tvaRate; + public int tvaSum; + public int discountSum; + public int ttcSum; + +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/Customer.java b/app/src/main/java/fr/pasteque/client/models/document/Customer.java new file mode 100644 index 0000000000000000000000000000000000000000..f22c74524238810129a7e48b5432d126c81a7dd4 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Customer.java @@ -0,0 +1,15 @@ +package fr.pasteque.client.models.document; + +/** + * Created by svirch_n on 25/04/16 + * This class is made from the NF-525 convention + * Last edited at 15:27. + */ +public class Customer { + + public String id; + public String documentId; + //public int lineNumber; + public String customerId; + +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/Invoice.java b/app/src/main/java/fr/pasteque/client/models/document/Invoice.java new file mode 100644 index 0000000000000000000000000000000000000000..af91948c6f0147a2dc2b3646f652c73969595797 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Invoice.java @@ -0,0 +1,17 @@ +package fr.pasteque.client.models.document; + +import fr.pasteque.client.models.Company; + +import java.io.Serializable; + +/** + * Created by svirch_n on 25/04/16 + * This class is made from the NF-525 convention + * Last edited at 15:38. + */ +public class Invoice extends Ticket implements Serializable { + + public String id; + public String contactName; + public Company company; +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/Payment.java b/app/src/main/java/fr/pasteque/client/models/document/Payment.java new file mode 100644 index 0000000000000000000000000000000000000000..1d86375cf6b13830517ab4b2c450d170bdca46e5 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Payment.java @@ -0,0 +1,25 @@ +package fr.pasteque.client.models.document; + +/** + * Created by svirch_n on 25/04/16 + * This class is made from the NF-525 convention + * Last edited at 15:34. + */ +public class Payment { + + public String id; + public String documentId; + public String paymentType; + public String paymentCode; + public String paymentName; + public String sum; + public String operationType; + //public String userCode; + public String date; + public String profitCenter; + public String cashRegisterCode; + public String cashierCode; + public String operatorCode; + public int quantity; + +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/Quantity.java b/app/src/main/java/fr/pasteque/client/models/document/Quantity.java new file mode 100644 index 0000000000000000000000000000000000000000..99aa70303ee4a21a5486c25e4a5fb8185cbd0896 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Quantity.java @@ -0,0 +1,11 @@ +package fr.pasteque.client.models.document; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 12:38. + */ +public class Quantity { + + public int quantity; + +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/Ticket.java b/app/src/main/java/fr/pasteque/client/models/document/Ticket.java new file mode 100644 index 0000000000000000000000000000000000000000..91a1ff9d749646c395c9063f0ac7681d4610c46d --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/Ticket.java @@ -0,0 +1,41 @@ +package fr.pasteque.client.models.document; + +import fr.pasteque.client.models.Company; + +import java.util.List; + +/** + * Created by svirch_n on 25/04/16 + * This class is made from the NF-525 convention + * Last edited at 12:17. + */ +public class Ticket { + + public String id; + public String documentId; + public String softwareVersion; + public int impressionNumber; + public Company innerCompanyName; + public String cashierCode; + public String cashierName; + public String operatorCode; + public String operatorName; + public String cashRegisterCode; + public int clientNumber; + //AAAAMMJJHHmmss + public String date; + public String operationType; + public String documentType; + public String ticketLineNumber; + + protected List ticketLines; + + public List cashings; + + public int htSum; + public int ttcSum; + + public Customer customer; + + public List payments; +} diff --git a/app/src/main/java/fr/pasteque/client/models/document/TicketLine.java b/app/src/main/java/fr/pasteque/client/models/document/TicketLine.java new file mode 100644 index 0000000000000000000000000000000000000000..cd79189f1d8a2250643200e7e6f0a033a9102ee1 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/models/document/TicketLine.java @@ -0,0 +1,32 @@ +package fr.pasteque.client.models.document; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 12:29. + */ +public class TicketLine { + + public String id; + public String documentId; + public int lineNumber; + //public String dataSource; + public String productName; + public Quantity quantity; + public String tvaCode; + public int tvaRate; + public int htValue; + public int ttcValue; + public String discountCode; + public int discountRate; + public int discountValue; + public int discountSum; + public int htSum; + public int ttcSum; + public String operationType; + //public String userCode; + public String date; + //public String profitCenter; + public String cashRegisterCode; + public String cashierCode; + public String operatorCode; +} diff --git a/app/src/main/java/fr/pasteque/client/utils/CouldNotCreatePdfException.java b/app/src/main/java/fr/pasteque/client/utils/CouldNotCreatePdfException.java new file mode 100644 index 0000000000000000000000000000000000000000..e9db29b3f92706147ed2af2024a3cb40c0f69d30 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/utils/CouldNotCreatePdfException.java @@ -0,0 +1,12 @@ +package fr.pasteque.client.utils; + +/** + * Created by svirch_n on 25/04/16 + * Last edited at 16:47. + */ +public class CouldNotCreatePdfException extends Exception { + + public CouldNotCreatePdfException(Exception e) { + super(e); + } +} diff --git a/app/src/main/java/fr/pasteque/client/utils/Date.java b/app/src/main/java/fr/pasteque/client/utils/Date.java new file mode 100644 index 0000000000000000000000000000000000000000..3d409906458c53c688de8d90063f5886a90f82c4 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/utils/Date.java @@ -0,0 +1,46 @@ +package fr.pasteque.client.utils; + +import fr.pasteque.client.Pasteque; + +import java.io.Serializable; +import java.text.SimpleDateFormat; + +/** + * Created by svirch_n on 29/04/16 + * Last edited at 10:43. + */ +public class Date implements Serializable{ + + private final double date; + private static final String TIME_FORMAT = "HH:mm:ss"; + private static final String DATE_FORMAT = "MM/dd/yyyy"; + private static final String DATE_TIME_FORMAT = DATE_FORMAT + " " + TIME_FORMAT; + + + public Date(double date) { + this.date = date; + } + + public Date() { + this.date = new java.util.Date().getTime(); + } + + public String format(String formatDate) { + return new SimpleDateFormat(formatDate).format(date); + } + + public String formatTime() { + return format(TIME_FORMAT); + } + + public String formatDate() { + return format(DATE_FORMAT); + } + + public String formatDateTime() { + return format(DATE_TIME_FORMAT); + } + + + +} diff --git a/app/src/main/java/fr/pasteque/client/utils/PastequeConfiguration.java b/app/src/main/java/fr/pasteque/client/utils/PastequeConfiguration.java index 0d64113c6f586029feacad71fd81e7a7cbd42af5..79cbb86539ca67aeaee07f9a23ebbfbe3a87a568 100644 --- a/app/src/main/java/fr/pasteque/client/utils/PastequeConfiguration.java +++ b/app/src/main/java/fr/pasteque/client/utils/PastequeConfiguration.java @@ -4,6 +4,8 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import java.util.Locale; + /** * Created by svirch_n on 22/12/15. */ @@ -36,6 +38,31 @@ public class PastequeConfiguration { return true; } + public String getCompanyName() { + return "SCIL"; + } + + public String getCompanyAdresse() { + return "19 Rue Nicolas Leblanc"; + } + + public String getCompanyPostCode() { + return "59000"; + } + + public String getCompanyCity() { + return "Lille"; + } + + public String getCompanyCountry() { + return "France"; + } + + public Locale getLocal() { + return Locale.FRANCE; + } + + public static class PrinterDriver { public static final String STARMPOP = "StarMPop"; public static final String EPSON = "EPSON ePOS"; diff --git a/app/src/main/java/fr/pasteque/client/utils/file/ExternalFile.java b/app/src/main/java/fr/pasteque/client/utils/file/ExternalFile.java index f4f4c47275ec3ed9fe3212260b9c4bb97d4c2cca..189fbb614e8e669a830dd94d49110db12bbdf4e1 100644 --- a/app/src/main/java/fr/pasteque/client/utils/file/ExternalFile.java +++ b/app/src/main/java/fr/pasteque/client/utils/file/ExternalFile.java @@ -33,12 +33,12 @@ public class ExternalFile extends File { * @throws FileNotFoundException */ @Override - protected FileInputStream openRead() throws FileNotFoundException { + public FileInputStream openRead() throws FileNotFoundException { return null; } @Override - protected FileOutputStream openWrite() throws FileNotFoundException { + public FileOutputStream openWrite() throws FileNotFoundException { return new FileOutputStream(this); } } \ No newline at end of file diff --git a/app/src/main/java/fr/pasteque/client/utils/file/File.java b/app/src/main/java/fr/pasteque/client/utils/file/File.java index 0748da1ec8f9b6f7c302e5f51083570ba609eba9..d90b0eadb55568f7ba498f8671e2ed4c9b95b5b9 100644 --- a/app/src/main/java/fr/pasteque/client/utils/file/File.java +++ b/app/src/main/java/fr/pasteque/client/utils/file/File.java @@ -84,7 +84,7 @@ public abstract class File extends java.io.File { return result; } - protected abstract FileInputStream openRead() throws FileNotFoundException; + public abstract FileInputStream openRead() throws FileNotFoundException; - protected abstract FileOutputStream openWrite() throws FileNotFoundException; + public abstract FileOutputStream openWrite() throws FileNotFoundException; } diff --git a/app/src/main/java/fr/pasteque/client/utils/file/InternalFile.java b/app/src/main/java/fr/pasteque/client/utils/file/InternalFile.java index 053f6c286b1e83383d3a6767709476a85837be35..b95bc414f6d437bfa88185a27eaaee07754efba1 100644 --- a/app/src/main/java/fr/pasteque/client/utils/file/InternalFile.java +++ b/app/src/main/java/fr/pasteque/client/utils/file/InternalFile.java @@ -21,15 +21,19 @@ public class InternalFile extends File { super(Pasteque.getAppContext().getDir(path, Context.MODE_PRIVATE), fileName); } + public InternalFile(String path, String fileName, int mode) { + super(Pasteque.getAppContext().getDir(path, mode), fileName); + } + public InternalFile(String dir, int directory) { super(dir, directory); } - protected FileInputStream openRead() throws FileNotFoundException { + public FileInputStream openRead() throws FileNotFoundException { return new FileInputStream(this); } - protected FileOutputStream openWrite() throws FileNotFoundException { + public FileOutputStream openWrite() throws FileNotFoundException { return new FileOutputStream(this); } } diff --git a/app/src/main/java/fr/pasteque/client/widgets/CompanyView.java b/app/src/main/java/fr/pasteque/client/widgets/CompanyView.java new file mode 100644 index 0000000000000000000000000000000000000000..5d1cf14fb9d3c516842aa4dd3b140bd3d857b89d --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/CompanyView.java @@ -0,0 +1,117 @@ +package fr.pasteque.client.widgets; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import fr.pasteque.client.R; +import fr.pasteque.client.models.Company; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by svirch_n on 26/04/16 + * Last edited at 12:06. + */ +public class CompanyView extends RelativeLayout { + + private static final String DEFAULT_TEXT = "N/A"; + private static final int PADDING = 0; + private static int name = 1; + private static int address = 2; + private static int city = 3; + private static int country = 4; + private final Map views = new HashMap<>(); + private ImageView logo; + + public CompanyView(Context context) { + super(context); + this.init(); + } + + public CompanyView(Context context, AttributeSet attrs) { + super(context, attrs); + this.init(); + } + + public CompanyView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.init(); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public CompanyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + this.init(); + } + + private void init() { + setPadding(PADDING, PADDING, PADDING, PADDING); + int[] ids = {CompanyView.name, CompanyView.address, CompanyView.city, CompanyView.country}; + int above = 0; + for (int each : ids) { + TextView textView = (TextView) inflate(getContext(), R.layout.pdf_text_line, null); + textView.setId(each); + textView.setText(CompanyView.DEFAULT_TEXT); + LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + if (above != 0) { + layoutParams.addRule(RelativeLayout.BELOW, above); + } + textView.setLayoutParams(layoutParams); + addView(textView); + views.put(each, textView); + above = each; + } + logo = (ImageView) inflate(getContext(), R.layout.pdf_customer_logo, null); + RelativeLayout.LayoutParams params = (LayoutParams) this.generateDefaultLayoutParams(); + params.addRule(CENTER_IN_PARENT, TRUE); + logo.setLayoutParams(params); + logo.setVisibility(INVISIBLE); + addView(logo); + } + + public void setCompany(Company company) { + if (company != null) { + showText(); + setText(name, company.name); + setText(address, company.address.address); + setText(city, company.address.city + " " + company.address.postCode); + setText(country, company.address.country); + } else { + showLogo(); + } + } + + private void setText(int id, String text) { + views.get(id).setText(text); + } + + public void noCompany() { + showLogo(); + } + + private void showLogo() { + for (TextView each : views.values()) { + each.setVisibility(INVISIBLE); + } + logo.setVisibility(VISIBLE); + setText(name, "A PADDING TEXT"); + } + + private void showText() { + for (TextView each : views.values()) { + each.setVisibility(VISIBLE); + } + logo.setVisibility(INVISIBLE); + } + + public void setListener(View.OnClickListener listener) { + this.setOnClickListener(listener); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/TodayDate.java b/app/src/main/java/fr/pasteque/client/widgets/TodayDate.java new file mode 100644 index 0000000000000000000000000000000000000000..335f9b24d351df79c0f6cf7a8b7eb1cb4dfd781c --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/TodayDate.java @@ -0,0 +1,47 @@ +package fr.pasteque.client.widgets; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.TextView; +import fr.pasteque.client.Pasteque; +import fr.pasteque.client.utils.Date; +import fr.pasteque.client.widgets.time.DateView; +import fr.pasteque.client.widgets.time.TimeView; + +/** + * Created by svirch_n on 29/04/16 + * Last edited at 10:39. + */ +public class TodayDate extends LinearLayout { + public TodayDate(Context context) { + super(context); + this.init(); + } + + public TodayDate(Context context, AttributeSet attrs) { + super(context, attrs); + this.init(); + } + + public TodayDate(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.init(); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public TodayDate(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + this.init(); + } + + public void init() { + setOrientation(VERTICAL); + Date date = Pasteque.now(); + new TimeView(this, "Time: ", date); + new DateView(this, "Date: ", date); + + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/pdf/Pdf.java b/app/src/main/java/fr/pasteque/client/widgets/pdf/Pdf.java new file mode 100644 index 0000000000000000000000000000000000000000..e20ae22355fcc81c0801a8713af2b13bec1cc51d --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/pdf/Pdf.java @@ -0,0 +1,89 @@ +package fr.pasteque.client.widgets.pdf; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.pdf.PdfDocument; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RelativeLayout; +import fr.pasteque.client.utils.CouldNotCreatePdfException; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created by svirch_n on 26/04/16 + * Last edited at 10:02. + */ +public class Pdf extends RelativeLayout { + + /** + * 160 * 8.3 + * 160 * 11.7 + */ + public static final int PDF_WIDTH_DP = 1323; + public static final int PDF_HEIGHT_DP = 1870; + + public Pdf(Context context) { + super(context); + } + + public Pdf(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public Pdf(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public Pdf(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(PDF_WIDTH_DP, MeasureSpec.EXACTLY); + heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(PDF_HEIGHT_DP, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + public void build(OutputStream stream) throws CouldNotCreatePdfException { + prepareView(); + PdfDocument document = prepareDocument(); + writeDocument(stream, document); + } + + private void prepareView() { + this.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight()); + this.forceLayout(); + this.setDrawingCacheEnabled(true); + this.buildDrawingCache(true); + this.requestLayout(); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + private PdfDocument prepareDocument() { + PdfDocument document = new PdfDocument(); + PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(this.getMeasuredWidth(), this.getMeasuredHeight(), 1).create(); + PdfDocument.Page page = document.startPage(pageInfo); + this.draw(page.getCanvas()); + document.finishPage(page); + return document; + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + private void writeDocument(OutputStream stream, PdfDocument document) throws CouldNotCreatePdfException { + // write the document content + try { + document.writeTo(stream); + } catch (IOException e) { + throw new CouldNotCreatePdfException(e); + } + + // close the document + document.close(); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfRow.java b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfRow.java new file mode 100644 index 0000000000000000000000000000000000000000..1a9d9907b727a22a90b8e1144c1dd551077fb435 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfRow.java @@ -0,0 +1,81 @@ +package fr.pasteque.client.widgets.pdf; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.Gravity; +import android.widget.LinearLayout; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; +import fr.pasteque.client.R; +import fr.pasteque.client.utils.CalculPrice; + +import java.text.DecimalFormat; + +/** + * Created by svirch_n on 27/04/16 + * Last edited at 10:04. + */ +public abstract class PdfRow extends TableRow { + + static final int PADDING = 0; + static final int CHILD_PADDING = 10; + static final int ROUND = 2; + private int[] gravity = { + Gravity.LEFT, + Gravity.RIGHT, + Gravity.RIGHT, + Gravity.RIGHT, + Gravity.RIGHT, + Gravity.RIGHT + }; + + + public PdfRow(Context context, TableLayout root) { + super(context); + init(root); + } + + public PdfRow(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public PdfRow(Context context) { + super(context); + } + + private void init(TableLayout root) { + if (root != null) { + TableLayout.LayoutParams rootParams = root.generateLayoutParams(null); + rootParams.setMargins(0, PADDING, 0, PADDING); + setLayoutParams(rootParams); + root.addView(this); + } + } + + protected void addElements(String[] elements) { + + for (int i = 0; i < elements.length; i++) { + if (elements[i] != null) { + TextView textView = (TextView) inflate(getContext(), R.layout.pdf_text_line, null); + LayoutParams params = (LayoutParams) this.generateDefaultLayoutParams(); + params.setMargins(CHILD_PADDING, CHILD_PADDING, CHILD_PADDING, CHILD_PADDING); + params.column = i; + textView.setLayoutParams(params); + textView.setText(elements[i]); + textView.setGravity(gravity[i]); + this.addView(textView); + } + } + } + + protected double round(Double number) { + return CalculPrice.round(number, ROUND); + } + + protected String formatTax(Double taxe) { + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + return decimalFormat.format(taxe * 100) + "%"; + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTaxeRow.java b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTaxeRow.java new file mode 100644 index 0000000000000000000000000000000000000000..11fa9e1f3cf6d58ed6fa5b38edf80adc306edc32 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTaxeRow.java @@ -0,0 +1,42 @@ +package fr.pasteque.client.widgets.pdf; + +import android.content.Context; +import android.widget.TableLayout; +import fr.pasteque.client.utils.CalculPrice; + +import java.text.DecimalFormat; + +/** + * Created by svirch_n on 28/04/16 + * Last edited at 15:56. + */ +public class PdfTaxeRow extends PdfRow { + + public PdfTaxeRow(Context context, TableLayout root) { + super(context, root); + } + + public void setHeader() { + String[] elements = { + "TVA ", + null, + null, + null, + "HT", + "Taxe", + }; + addElements(elements); + } + + public void setTaxe(Double taxe, Double taxeValue, Double excValue) { + String[] elements = { + formatTax(taxe), + null, + null, + null, + String.valueOf(round(excValue)), + String.valueOf(round(taxeValue)) + }; + addElements(elements); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTicketRow.java b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTicketRow.java new file mode 100644 index 0000000000000000000000000000000000000000..eab9a249f79c63e80dd64d7b1a6d8a51679d24ef --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTicketRow.java @@ -0,0 +1,52 @@ +package fr.pasteque.client.widgets.pdf; + +import android.content.Context; +import android.widget.TableLayout; +import fr.pasteque.client.models.TicketLine; + +import java.text.DecimalFormat; + +/** + * Created by svirch_n on 28/04/16 + * Last edited at 15:25. + */ +public class PdfTicketRow extends PdfRow { + + public PdfTicketRow(Context context, TableLayout root) { + super(context, root); + } + + + public void setTicket(TicketLine ticketLine) { + String[] elements = { + ticketLine.getProduct().getLabel(), + "x " + formatQuantity(ticketLine.getQuantity()), + formatRound(ticketLine.getProductExcTax()), + formatTax(ticketLine.getDiscountRate()), + formatTax(ticketLine.getProduct().getTaxRate()), + formatRound(ticketLine.getTotalDiscPIncTax()) + }; + addElements(elements); + } + + private String formatRound(double value) { + return String.valueOf(round(value)); + } + + private String formatQuantity(double quantity) { + DecimalFormat decimalFormat = new DecimalFormat("#"); + return decimalFormat.format(quantity); + } + + public void setHeader() { + String[] elements = { + "Product Name", + "Quantity", + "Unit HT", + "Discount", + "TVA", + "Total TTC" + }; + addElements(elements); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTotalRow.java b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTotalRow.java new file mode 100644 index 0000000000000000000000000000000000000000..1d8ac127cbe21c43763d3411134d01e20eba7c4c --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/pdf/PdfTotalRow.java @@ -0,0 +1,45 @@ +package fr.pasteque.client.widgets.pdf; + +import android.content.Context; +import android.widget.TableLayout; +import fr.pasteque.client.models.Ticket; + +import java.text.DecimalFormat; + +/** + * Created by svirch_n on 28/04/16 + * Last edited at 16:32. + */ +public class PdfTotalRow extends PdfRow { + + + public PdfTotalRow(Context applicationContext, TableLayout content) { + super(applicationContext, content); + } + + + public void setTotal(Ticket total) { + DecimalFormat df = new DecimalFormat("#.00"); + String[] elements = { + null, + null, + null, + String.valueOf(df.format(round(total.getTicketPriceExcTax()))), + String.valueOf(df.format(round(total.getTicketTax()))), + String.valueOf(df.format(round(total.getTicketPrice()))) + }; + addElements(elements); + } + + public void setHeader() { + String[] elements = { + "Total ", + null, + null, + "HT", + "Taxe", + "TTC", + }; + addElements(elements); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/time/DateTimeView.java b/app/src/main/java/fr/pasteque/client/widgets/time/DateTimeView.java new file mode 100644 index 0000000000000000000000000000000000000000..15f7bbeda624d35793a5503e10e3c31ba6de39d3 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/time/DateTimeView.java @@ -0,0 +1,37 @@ +package fr.pasteque.client.widgets.time; + +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.TextView; +import fr.pasteque.client.utils.Date; +import fr.pasteque.client.widgets.TodayDate; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + +/** + * Created by svirch_n on 29/04/16 + * Last edited at 11:23. + */ +public abstract class DateTimeView extends TextView { + + private String preText; + private Date date; + + public DateTimeView(TodayDate todayDate, String preText, Date date) { + super(todayDate.getContext()); + this.preText = preText; + this.date = date; + this.init(todayDate); + } + + private void init(TodayDate root) { + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); + setLayoutParams(params); + root.addView(this); + String text = preText + getTimeFormat(this.date); + setText(text); + } + + protected abstract String getTimeFormat(Date date); +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/time/DateView.java b/app/src/main/java/fr/pasteque/client/widgets/time/DateView.java new file mode 100644 index 0000000000000000000000000000000000000000..2cfe7badbcd99750bf4801843ab60cf80a277391 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/time/DateView.java @@ -0,0 +1,20 @@ +package fr.pasteque.client.widgets.time; + +import fr.pasteque.client.utils.Date; +import fr.pasteque.client.widgets.TodayDate; + +/** + * Created by svirch_n on 29/04/16 + * Last edited at 11:28. + */ +public class DateView extends DateTimeView { + + public DateView(TodayDate todayDate, String preText, Date date) { + super(todayDate, preText, date); + } + + @Override + protected String getTimeFormat(Date date) { + return date.formatDate(); + } +} diff --git a/app/src/main/java/fr/pasteque/client/widgets/time/TimeView.java b/app/src/main/java/fr/pasteque/client/widgets/time/TimeView.java new file mode 100644 index 0000000000000000000000000000000000000000..f3b0a0cf1f90d3173da6b86368483e5ac4df94d7 --- /dev/null +++ b/app/src/main/java/fr/pasteque/client/widgets/time/TimeView.java @@ -0,0 +1,20 @@ +package fr.pasteque.client.widgets.time; + +import fr.pasteque.client.utils.Date; +import fr.pasteque.client.widgets.TodayDate; + +/** + * Created by svirch_n on 29/04/16 + * Last edited at 11:28. + */ +public class TimeView extends DateTimeView { + + public TimeView(TodayDate todayDate, String preText, Date date) { + super(todayDate, preText, date); + } + + @Override + protected String getTimeFormat(Date date) { + return date.formatTime(); + } +} diff --git a/app/src/main/res/layout/invoice.xml b/app/src/main/res/layout/invoice.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b9b35bfb69ae0003504a16be944239156c8d5f2 --- /dev/null +++ b/app/src/main/res/layout/invoice.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/pdf_customer_logo.xml b/app/src/main/res/layout/pdf_customer_logo.xml new file mode 100644 index 0000000000000000000000000000000000000000..76e9363bf58c7e75668c8b23bc8d0a1907b06448 --- /dev/null +++ b/app/src/main/res/layout/pdf_customer_logo.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/pdf_divider.xml b/app/src/main/res/layout/pdf_divider.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd2c9ac2728b47502197aaf9d74c5aab1587e21d --- /dev/null +++ b/app/src/main/res/layout/pdf_divider.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/pdf_invoice_viewer.xml b/app/src/main/res/layout/pdf_invoice_viewer.xml new file mode 100644 index 0000000000000000000000000000000000000000..97979a1ba795171fc8ea7bbbbb1a87d94a8a10a7 --- /dev/null +++ b/app/src/main/res/layout/pdf_invoice_viewer.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/pdf_item_line.xml b/app/src/main/res/layout/pdf_item_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce38812084bb203fae3fa4aa06c9e9fc85b81be6 --- /dev/null +++ b/app/src/main/res/layout/pdf_item_line.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/pdf_text_line.xml b/app/src/main/res/layout/pdf_text_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..44edbe27b8e281a16306e2ffbe364c9944b31d6b --- /dev/null +++ b/app/src/main/res/layout/pdf_text_line.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/pdf_creator_activity.xml b/app/src/main/res/menu/pdf_creator_activity.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8addcb48b73436f227c2cabbf573a43bb499a33 --- /dev/null +++ b/app/src/main/res/menu/pdf_creator_activity.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/err_string.xml b/app/src/main/res/values-fr/err_string.xml index 9e5966ee09ebcf511e33e2028611efadeaedb84b..0791e2c0be414baa147d672592b9c861f2ba5026 100644 --- a/app/src/main/res/values-fr/err_string.xml +++ b/app/src/main/res/values-fr/err_string.xml @@ -47,4 +47,7 @@ Les données doivent être envoyées avant de se déconnecter La caisse est ouverte et doit être fermée Barcode erroné + + Impossible de créer le PDF + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5e59e1cc88e99e3dafed8a466abb0989a70f3b62..8f3372cdff1097644741ee4959653f75e9471514 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -329,5 +329,10 @@ Configuration avancée Rapport par mail Envoie des rapports d\'erreur par mail + Facture + Modifier un client + Envoyer + Il n\'y a pas de client mail d\'installé. + Choisir un client mail diff --git a/app/src/main/res/values/err_string.xml b/app/src/main/res/values/err_string.xml index 026c453afc093cf9a2a6c15a00802c7cde3da24c..f60c3359d0325d7ec6463a1013411d7a6dab8529 100644 --- a/app/src/main/res/values/err_string.xml +++ b/app/src/main/res/values/err_string.xml @@ -47,4 +47,7 @@ Local data must be sent to disconnect Cash is opened and must be closed Wrong barcode + + Could not create pdf +9 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c7a760dc2940637b2b22f1bb5d989124e365e54d..86ad7e857deac6f4199e6a129d1672850551590f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -343,5 +343,10 @@ Advanced configuration Mail reporting Enable mail reporting + Invoice + Edit customer + Send + There are no email clients installed. + Pick an Email client