Материал: Создание мобильного приложения для оптимизации и контроля работы торговых агентов компаний

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Действия кнопок: "Не охранять", "Черновик", "Отправить".

Режим "Не охранять"- предназначен для выхода из режима оформления "ЗАКАЗ" без сохранения данных.

Режим "Черновик"- предназначен для сохранения ЗАКАЗа в документах на мобильном устройстве, с возможностью последующего редактирования, но без отправки в офис.

Режим "Отправить" предназначен для сохранения ЗАКАЗа и последующей отправки в офис для оформления операторами.

ВАЖНО!!!

После сохранения вы попадаете в "ЗАДАЧИ", для выполнения других задач.

Для выхода из режима "ВИЗИТ", после выполнения всех или одной, нажмите стрелку слева от надписи "ВИЗИТ". Вы вернетесь в меню "МАРШРУТЫ" для продолжения оформления документов в других торговых точках по маршруту.

Для выхода из режима "МАРШРУТЫ", нажмите стрелку слева от надписи "МАРШРУТ" в попадете в главное меню программы.

Для отправки данных и получения обновленных сведений по остаткам и дебиторской задолженности из учетной системы вашего предприятия нажмите кнопку СВЯЗЬ".

Оформление документа "ВОЗВРАТ"


Оформление документа "ВОЗВРАТ" аналогично оформлению документа "ЗАКАЗ".

Сохранение и выход из документа "ВОЗВРАТ" аналогично выходу из документа "ЗАКАЗ".

Сделать Фото.

Нажимаете в окне задач "Сделать фото". После этого происходит активация режима фотоаппарата вашего мобильного устройства. Вы производите фотографирование и сохраняете фотографии в мобильном устройстве. При активации режима "СВЯЗЬ" происходит отправка фотографий на сервер.

ВАЖНАЯ ИНФОРМАЦИЯ,

Срок хранения фотографий на мобильном устройстве составляет 10 дней, для исключения случаев переполнения памяти мобильного устройства.

Загрузка фотографий для фото-презентора осуществляется только по каналу связи Wi-Fi.

2. Листинг программы

com.likesoft.shop;

import android.app.Activity;android.app.Application;android.content.Intent;android.content.SharedPreferences;android.content.SharedPreferences.Editor;android.os.Environment;android.preference.PreferenceManager;android.view.ViewConfiguration;com.crittercism.app.Crittercism;com.google.android.gcm.GCMRegistrar;com.likesoft.shop.services.SendService;com.likesoft.shop.theming.Theming;com.likesoft.shop.utils.Preparings;java.lang.reflect.Field;class MerkuryApplication extends Application {static final int THUMBNAILS_SIZE = 150;

// public static String OPTServiceFolder = Environment.getExternalStorageDirectory().toString()+"/optservice";static final String PhotosFolder = Environment.getExternalStorageDirectory().toString() + "/optservice/photos";static final String ExternalDbFolder = Environment.getExternalStorageDirectory().toString() + "/optservice/database";static SharedPreferences pref;

@Overridevoid onCreate() {.onCreate();

//Настройка по умолчаниюprefDef = PreferenceManager.getDefaultSharedPreferences(this);(!prefDef.getBoolean("Default_setting", false)) {ed = prefDef.edit();.putString("GPS_ALLOWED", "0");.putBoolean("Default_setting", true);.commit();

}.setDefaultUncaughtExceptionHandler(Log.getInstance(this));

//GCM.checkDevice(this);.checkManifest(this);

//Crittercism.initialize(getApplicationContext(), "afd8389a692f411698b4ff089678219900555300");{config = ViewConfiguration.get(this);menuKeyField = ViewConfiguration.class

.getDeclaredField("sHasPermanentMenuKey");(menuKeyField != null) {.setAccessible(true);.setBoolean(config, false);

}

} catch (Exception e) {.printStackTrace();

}gcmId = GCMRegistrar.getRegistrationId(this);

if (gcmId.equals("")) { // Если отсутствует, то регистрируемся

GCMRegistrar.register(this, GCMConfig.SENDER_ID);

} else {.i(this, "GCM: Already registered: " + gcmId);

}= PreferenceManager.getDefaultSharedPreferences(this);ed = pref.edit();.putString("opened_visit", "");.commit();

// Копируем базу с флешки в приложуху

// File f = new File(Environment.getExternalStorageDirectory().toString()+"/db.sqlite");

// try {

// FileManagement.copy(f, new File(DbOpenHelper.getPath(this)));

// } catch (IOException e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

//Отправка данныхi = new Intent(this, SendService.class);(i);

}

@Overridevoid onTerminate() {.onTerminate();

}static boolean PrepareActivity(Activity a) {.switchStyle(a);(!Preparings.checkVersion(a)) {false;

}(!Preparings.checkGPS(a)) {false;

}Preparings.checkGPRS(a);

}

}com.likesoft.shop.db;android.content.Context;android.content.SharedPreferences;android.database.Cursor;android.database.sqlite.SQLiteDatabase;android.database.sqlite.SQLiteOpenHelper;android.os.Environment;android.preference.PreferenceManager;android.util.Log;com.likesoft.shop.MerkuryApplication;com.likesoft.shop.utils.PhotosManagement;java.io.File;class DbOpenHelper extends SQLiteOpenHelper {static final String TAG = "DbOpenHelper";static final String DATABASE_NAME = "db.db";static final int DATABASE_VERSION = 23;static DbOpenHelper mInstance;static SQLiteDatabase db;

//Структура описана по след. ссылке:

//https://docs.google.com/a/mobexpert.ru/document/d/1oe5RmmOkxxHxypKRv_4DAn8kROQ7GlC3_9IisIo0Cec/edit#

private static final String[] CREATE_SCRIPT = new String[]{

"CREATE TABLE tabstates (name text PRIMARY KEY, " +

"md float)",

"CREATE TABLE customers (_id int PRIMARY KEY, " +

"name text, " +

"searchname text, " +

"customertype_id int)",

"CREATE TABLE customertypes (_id int PRIMARY KEY, " +

"name text, " +

"receivableviewmode int, " +

"image_text text, " +

"image_url text)",

"CREATE TABLE shops (_id int PRIMARY KEY, " +

"name text, " +

"searchname text, " +

"address text, " +

"customer_id int, " +

"phone text, " +

"latitude float, " +

"longitude float, " +

"status int, " +

"shopclass_id int, " +

"list_visited text, " +

"class_trade_point text)",

"CREATE TABLE shopclasses (_id int PRIMARY KEY, " +

"name text," +

"image_text text, " +

"image_url text)",

"CREATE TABLE contactfaces (_id text PRIMARY KEY, " +

"name text, " +

"position text, " +

"customer_id int, " +

"shop_id int, " +

"state int)",

"CREATE TABLE contactdata (_id text PRIMARY KEY, " +

"type int, " +

"value text, " +

"contactface_id int, " +

"customer_id int, " +

"shop_id int, " +

"state int)",

"CREATE TABLE routes (_id int PRIMARY KEY, " +

"shop_id int, " +

"ord int, " +

"weekday int)",

"CREATE TABLE receivable (_id int PRIMARY KEY, " +

"customer_id int, " +

"shop_id int, " +

"agent_id int, " +

"receivable_sum float, " +

"overdue_sum float, " +

"overdue_days int)",

"customer_id int, " +

"shop_id int, " +

"agent_id int, " +

"agent_name text, " +

"doc_uid text, " +

"doc_name text, " +

"doc_date datetime," +

"doc_type int, " +

"doc_firm_id int, " +

"doc_contract_id int, " +

"total float, " +

"debt float, " +

"payment_date datetime)",

"CREATE TABLE docs (_id text PRIMARY KEY, " +

"type int, " +

"state int)",

"CREATE TABLE docproperties (doc_id text, " +

"property int, " +

"value text)",

"CREATE TABLE docitems (doc_id text, " +

"multirow_id int, " +

"object_id int, " +

"object_name text, " +

"object_property text, " +

"amount float, " +

"unit_id int, " +

"unit_name text, " +

"unit_k float, " +

"price float, " +

"weight float)",

"CREATE TABLE pricelists (_id int PRIMARY KEY, " +

"name text)",

"CREATE TABLE prices (_id int PRIMARY KEY, " +

"pricelist_id int, " +

"goods_id int, " +

"price float)",

"CREATE TABLE settings (_id int PRIMARY KEY, " +

"name text, " +

"value text)",

"CREATE TABLE deftasks (_id int PRIMARY KEY, " +

"type int, " +

"task_text text, " +

"required bit, " +

"depend_on text," +

"ord int," +

"extra text)",

"CREATE TABLE goods (_id int PRIMARY KEY, " +

"tree_id int, " +

"name text, " +

"searchname text, " +

"fullname text, " +

"isfolder bit, " +

"parent_id int, " +

"unit_id int, " +

"sort text, " +

"lft int, " +

"rght int, " +

"minorder float)",

"CREATE TABLE goodsimages (_id int PRIMARY KEY, " +

"goods_id int, " +

"hashcode text, " +

"size int)",

"CREATE TABLE units (_id int PRIMARY KEY, " +

"name text, " +

"def bit, " +

"k float, " +

"owner_id int, " +

"onlyint bit, " +

"weight float," +

"barcode text)",

"CREATE TABLE firms (_id int PRIMARY KEY, " +

"name text," +

"defpricelist_id int)",

"CREATE TABLE contracts (_id int PRIMARY KEY, " +

"name text," +

"firm_id int," +

"customer_id int," +

"shop_id int," +

"limit_days int," +

"limit_sum float," +

"pricelist_id int)",

"CREATE TABLE stores (_id int PRIMARY KEY, " +

"name text)",

"CREATE TABLE stocks (_id int PRIMARY KEY, " +

"store_id int, " +

"goods_id int, " +

"stock float)",

"CREATE TABLE goodspackage (_id int PRIMARY KEY, " +

"name text)",

"CREATE TABLE goodspackage_items (_id int PRIMARY KEY, " +

"gpackage_id int," +

"goods_id int)",

"CREATE TABLE messages (_id text, " +

"message_text text," +

"message_date datetime," +

"message_new bool," +

"message_from text," +

"message_to text)",

"CREATE TABLE goodssaleplan (_id int," +

"agent_id int," +

"goods_name text," +

"plan float," +

"plan_unit text," +

"fact float," +

"current float," +

"forecast float)",

"CREATE TABLE unitaliases (_id int," +

"unit_name text," +

"unit_alias text)",

"CREATE TABLE agentsettings (_id int PRIMARY KEY, " +

"name text, " +

"value text)",

"CREATE TABLE saleshistory (_id int PRIMARY KEY, " +

"period datetime, " +

"shop_id int, " +

"goods_id int, " +

"order_amount float, " +

"shipment float, " +

"stock float, " +

"outdate float)",

"INSERT INTO unitaliases VALUES ( 1, 'шт.', 'шт')",

"INSERT INTO unitaliases VALUES ( 2, 'шт.', 'шт.')",

"INSERT INTO unitaliases VALUES ( 3, 'шт.', 'штук')",

"INSERT INTO unitaliases VALUES ( 4, 'шт.', 'штука')",

"INSERT INTO unitaliases VALUES ( 5, 'шт.', 'штуки')",

"INSERT INTO unitaliases VALUES ( 6, 'бут.', 'бут')",

"INSERT INTO unitaliases VALUES ( 7, 'бут.', 'бут.')",

"INSERT INTO unitaliases VALUES ( 8, 'бут.', 'бутылка')",

"INSERT INTO unitaliases VALUES ( 9, 'бут.', 'бутылок')",

"INSERT INTO unitaliases VALUES ( 10, 'бут.', 'бутылки')",

"INSERT INTO unitaliases VALUES ( 11, 'пач.', 'пач')",

"INSERT INTO unitaliases VALUES ( 12, 'пач.', 'пач.')",

"INSERT INTO unitaliases VALUES ( 13, 'пач.', 'пачка')",

"INSERT INTO unitaliases VALUES ( 14, 'пач.', 'пачек')",

"INSERT INTO unitaliases VALUES ( 15, 'пач.', 'пачки')",

"INSERT INTO unitaliases VALUES ( 16, 'руб.', 'руб')",

"INSERT INTO unitaliases VALUES ( 17, 'руб.', 'руб.')",

"INSERT INTO unitaliases VALUES ( 18, 'руб.', 'рубль')",

"INSERT INTO unitaliases VALUES ( 19, 'руб.', 'рублей')",

"INSERT INTO unitaliases VALUES ( 20, 'руб.', 'рубли')",

"INSERT INTO unitaliases VALUES ( 21, 'кг.', 'кг')",

"INSERT INTO unitaliases VALUES ( 22, 'кг.', 'кг.')",

"INSERT INTO unitaliases VALUES ( 23, 'кг.', 'килограмм')",

"INSERT INTO unitaliases VALUES ( 24, 'кг.', 'килограммов')",

"INSERT INTO unitaliases VALUES ( 25, 'кг.', 'килограмма')",

"INSERT INTO tabstates VALUES ('customers', 0.0)",

"INSERT INTO tabstates VALUES ('customertypes', 0.0)",

"INSERT INTO tabstates VALUES ('shops', 0.0)",

"INSERT INTO tabstates VALUES ('shopclasses', 0.0)",

"INSERT INTO tabstates VALUES ('receivable', 0.0)",

"INSERT INTO tabstates VALUES ('documents', 0.0)",

"INSERT INTO tabstates VALUES ('docproperties', 0.0)",

"INSERT INTO tabstates VALUES ('docitems', 0.0)",

"INSERT INTO tabstates VALUES ('pricelists', 0.0)",

"INSERT INTO tabstates VALUES ('prices', 0.0)",

"INSERT INTO tabstates VALUES ('deftasks', 0.0)",

"INSERT INTO tabstates VALUES ('routes', 0.0)",

"INSERT INTO tabstates VALUES ('goods', 0.0)",

"INSERT INTO tabstates VALUES ('goodsimages', 0.0)",

"INSERT INTO tabstates VALUES ('units', 0.0)",

"INSERT INTO tabstates VALUES ('stores', 0.0)",

"INSERT INTO tabstates VALUES ('stocks', 0.0)",

"INSERT INTO tabstates VALUES ('firms', 0.0)",

"INSERT INTO tabstates VALUES ('contracts', 0.0)",

"INSERT INTO tabstates VALUES ('contactfaces', 0.0)",

"INSERT INTO tabstates VALUES ('contactdata', 0.0)",

"INSERT INTO tabstates VALUES ('debtdocs', 0.0)",

"INSERT INTO tabstates VALUES ('settings', 0.0)",

"INSERT INTO tabstates VALUES ('goodspackage', 0.0)",

"INSERT INTO tabstates VALUES ('goodspackage_items', 0.0)",

"INSERT INTO tabstates VALUES ('goodssaleplan', 0.0)",

"INSERT INTO tabstates VALUES ('unitaliases', 0.0)",

"INSERT INTO tabstates VALUES ('agentsettings', 0.0)",

"INSERT INTO tabstates VALUES ('saleshistory', 0.0)",

"CREATE TABLE commenttemplate (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +

"comment text, " +

"count int)",

"CREATE INDEX docproperties_index on docproperties (doc_id, property)",

"CREATE INDEX docitems_index on docitems (doc_id, multirow_id, object_id)",

"CREATE TABLE forms (_id int PRIMARY KEY, " +

"name text)",

"CREATE TABLE form_items (_id int PRIMARY KEY, " +

"form_id int," +

"name text," +

"type int," +

"vals text," +

"section text," +

"doc_id text," +

"required bit," +

"ord int)",

" CREATE TABLE reports (_id int PRIMARY KEY, " +

"customer text," +

"address text," +

"date text," +

"price float," +

"stock_type text)",

"INSERT INTO tabstates VALUES ('forms', 0.0)",

"INSERT INTO tabstates VALUES ('form_items', 0.0)",

};static String getDbName(Context context) {pref = PreferenceManager.getDefaultSharedPreferences(context);(pref.getString("dbstorage", "internal").equals("internal"))DATABASE_NAME;getPath(context, false);

}DbOpenHelper(Context context) {(context, getDbName(context), null, DATABASE_VERSION);

}

/**

* Get default instance of the class to keep it a singleton

*

* @param context the application context

*/static DbOpenHelper getInstance(Context context) {(mInstance == null) {= new DbOpenHelper(context);

}mInstance;

}

/**

* Returns a writable database instance in order not to open and close many

* SQLiteDatabase objects simultaneously

*

* @return a writable instance to SQLiteDatabase

*/SQLiteDatabase getDb() {((db == null) || (!db.isOpen())) {= this.getWritableDatabase();

}db;

}

@Overridevoid close() {.close();(db != null) {.close();= null;

}= null;

}

@Overridevoid onCreate(SQLiteDatabase db) {(String sql_line : CREATE_SCRIPT) {{.execSQL(sql_line);

} catch (Exception e) {err = (e.getMessage() == null) ? "Unknown Error" : e.getMessage();.e(TAG, err);

}

}.renameOldPhotos(db);

}

@Overridevoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {(oldVersion < 6) {{cursor = db.rawQuery("SELECT count(name) FROM sqlite_master WHERE type='table' AND name='agentsettings'", null);(cursor.moveToFirst()) {(cursor.getInt(0) == 0) {.execSQL("CREATE TABLE agentsettings (_id int PRIMARY KEY, " +

"name text, " +

"value text)");.execSQL("DELETE FROM tabstates WHERE name='agentsettings'");.execSQL("INSERT INTO tabstates VALUES ('agentsettings', 0.0)");

}.close();

}.execSQL("CREATE TABLE saleshistory (_id int PRIMARY KEY, " +

"period datetime, " +

"shop_id int, " +

"goods_id int, " +

"order_amount float, " +

"shipment float, " +

"stock float, " +

"outdate float)");.execSQL("INSERT INTO tabstates VALUES ('saleshistory', 0.0)");

} catch (Exception e) {err = (e.getMessage() == null) ? "Unknown Error" : e.getMessage();.e(TAG, err);

}

}(oldVersion < 7) {{.execSQL("CREATE TABLE goodssaleplan (_id int," +

"agent_id int," +

"goods_name text," +

"plan float," +

"plan_unit text," +

"fact float," +

"current float," +

"forecast float)");.execSQL("DELETE FROM goodssaleplan");.execSQL("ALTER TABLE goods ADD COLUMN minorder float");

} catch (Exception e) {err = (e.getMessage() == null) ? "Unknow Error" : e.getMessage();.e(TAG, err);

}

}(oldVersion < 8) {.execSQL("CREATE TABLE commenttemplate (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +

"comment text, " +

"count int)");

}(oldVersion < 9) {.execSQL("ALTER TABLE deftasks ADD COLUMN ord int");.execSQL("ALTER TABLE goods ADD COLUMN tree_id int");.execSQL("ALTER TABLE goods ADD COLUMN lft int");.execSQL("ALTER TABLE goods ADD COLUMN rght int");

}(oldVersion < 12) {.execSQL("CREATE INDEX docproperties_index on docproperties (doc_id, property)");.execSQL("CREATE INDEX docitems_index on docitems (doc_id, multirow_id, object_id)");

}(oldVersion < 14) {

//При переходе на 14ю версию поменалась папка где лежат фотки, переименуем ее

File old = new File(Environment.getExternalStorageDirectory().toString() + "/mercuryPhotos");current = new File(MerkuryApplication.PhotosFolder);(old.exists()) {(!current.exists()).renameTo(current);

}

}(oldVersion < 15) {.execSQL("DROP TABLE goodspackage_items");.execSQL("CREATE TABLE goodspackage_items (_id int PRIMARY KEY, " +

"gpackage_id int," +

"goods_id int)");

}(oldVersion < 16) {.execSQL("CREATE TABLE forms (_id int PRIMARY KEY, " +

"name text)");.execSQL("CREATE TABLE form_items (_id int PRIMARY KEY, " +

"form_id int," +

"name text," +

"type int," +

"vals text," +

"section text," +

"required bit)");.execSQL("INSERT INTO tabstates VALUES ('forms', 0.0)");.execSQL("INSERT INTO tabstates VALUES ('form_items', 0.0)");.execSQL("ALTER TABLE deftasks ADD COLUMN extra text");

}(oldVersion < 17) {.execSQL("ALTER TABLE units ADD COLUMN barcode text");

}(oldVersion < 18) {.execSQL("ALTER TABLE form_items ADD COLUMN ord int");

}(oldVersion < 19) {.execSQL("ALTER TABLE shops ADD COLUMN class_trade_point text");.execSQL("ALTER TABLE shops ADD COLUMN list_visited text");

}(oldVersion < 20) {.execSQL("CREATE TABLE reports (_id int PRIMARY KEY, " +

"customer text," +

"address text," +

"date text," +

"price float," +

"stock_type text)");

}(oldVersion < 21) {.execSQL("BEGIN TRANSACTION");.execSQL("CREATE TEMPORARY TABLE shops_backup( "+

"_id int PRIMARY KEY, " +

"name text, " +

"searchname text, " +

"address text, " +

"customer_id int, " +

"phone text, " +

"latitude float, " +

"longitude float, " +

"status int, " +

"shopclass_id int) ");.execSQL("INSERT INTO shops_backup SELECT " +

"_id " +

",name "+

",searchname " +

",address " +

",customer_id " +

",phone " +

",latitude " +

",longitude " +

",status " +

",shopclass_id FROM shops");.execSQL("DROP TABLE shops");.execSQL("CREATE TABLE shops (_id int PRIMARY KEY, " +

"name text, " +

"searchname text, " +

"address text, " +

"customer_id int, " +

"phone text, " +

"latitude float, " +

"longitude float, " +

"status int, " +

"shopclass_id int)");.execSQL("INSERT INTO shops SELECT " +

"_id " +

",name "+

",searchname " +

",address " +

",customer_id " +

",phone " +

",latitude " +

",longitude " +

",status " +

",shopclass_id FROM shops_backup");.execSQL("DROP TABLE shops_backup");.execSQL("ALTER TABLE shops ADD COLUMN list_visited text");.execSQL("ALTER TABLE shops ADD COLUMN class_trade_point text");.execSQL("COMMIT");

}(oldVersion < 22) {.execSQL("UPDATE shops SET list_visited='ORDER:;RETURN:;VANSHIPMENT:', class_trade_point='Выберите класс'");

}(oldVersion < 23) {.execSQL("ALTER TABLE form_items ADD COLUMN doc_id text");.execSQL("UPDATE form_items SET doc_id=''");

}

//Если происходит обновление то полная синхронизация всегда

db.execSQL("UPDATE tabstates SET md = 0.0");

}static String getPath(Context context) {pref = PreferenceManager.getDefaultSharedPreferences(context);getPath(context, pref.getString("dbstorage", "internal").equals("internal"));

}static String getPath(Context context, boolean internal) {(internal)context.getDatabasePath(DATABASE_NAME).getAbsolutePath();MerkuryApplication.ExternalDbFolder + "/" + DATABASE_NAME;

}

}

3. Охрана труда

. Эксплуатация устройств компьютера.

1.1. Инструкция по охране труда на ПК должна находиться на рабочем месте.

.2. Требование инструкции являются обязательными для работающих, невыполнение этих требований рассматривается как нарушение трудовой дисциплины.

.3. К работе на ПК допускаются лица не имеющих медицинских противопоказаний, получившие инструктаж на рабочем месте, обученные безопасным приёмам и методам работы на ПК, ознакомленные с данной инструкцией.

.4. Работающие на ПК обязаны соблюдать трудовую дисциплину, правила трудового распорядка. Не допускается пребывание за ПК посторонних лиц.

.5. Необходимо учитывать, что аспекты влияния монитора ПК ( видимое излучение, блики и мерцание, низкочастотное поле, электромагнитное излучение) могут привести к серьезным нарушениям здоровья работающего.

.6. Запрещается применять на окна шторы тёмной окраски. Шторы должны быть под цвет стен.

.7.Для предотвращения взрыва или пожара: