From 4109ce018a31620b820856ab0b46e5a11f628ede Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 3 Jun 2022 19:15:13 +0700 Subject: [PATCH 01/74] docker compose done --- .gitignore | 4 + config/config.conf | 37 ++++ config/odoo.conf | 60 ++++++ docker-compose.yml | 49 +++++ local-addons/merctrans_projects/__init__.py | 0 .../merctrans_projects/__manifest__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin .../__pycache__/__init__.cpython-39.pyc | Bin .../controllers/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin .../__pycache__/__init__.cpython-39.pyc | Bin .../__pycache__/controllers.cpython-38.pyc | Bin .../__pycache__/controllers.cpython-39.pyc | Bin .../controllers/controllers.py | 0 local-addons/merctrans_projects/demo/demo.xml | 0 .../merctrans_projects/models/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin .../__pycache__/__init__.cpython-39.pyc | Bin .../__pycache__/merctrans_jobs.cpython-38.pyc | Bin .../__pycache__/merctrans_jobs.cpython-39.pyc | Bin .../merctrans_projects.cpython-38.pyc | Bin .../merctrans_projects.cpython-39.pyc | Bin .../merctrans_sales.cpython-38.pyc | Bin .../merctrans_sales.cpython-39.pyc | Bin .../models/__pycache__/models.cpython-38.pyc | Bin .../__pycache__/services.cpython-38.pyc | Bin .../models/merctrans_jobs.py | 0 .../models/merctrans_projects.py | 0 .../security/ir.model.access.csv | 0 .../merctrans_projects/security/security.xml | 0 .../security/security_rules.xml | 0 local-addons/merctrans_projects/tags | 0 .../merctrans_projects/views/__init__.py | 0 .../merctrans_projects/views/__manifest__.py | 0 .../merctrans_projects/views/jobs.xml | 0 .../views/projects_menus.xml | 0 local-addons/merctrans_projects/views/tags | 0 .../merctrans_projects/views/templates.xml | 0 tags | 176 ++++++++++++++++++ 39 files changed, 326 insertions(+) create mode 100644 config/config.conf create mode 100644 config/odoo.conf create mode 100644 docker-compose.yml mode change 100644 => 100755 local-addons/merctrans_projects/__init__.py mode change 100644 => 100755 local-addons/merctrans_projects/__manifest__.py mode change 100644 => 100755 local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/controllers/__init__.py mode change 100644 => 100755 local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/controllers/controllers.py mode change 100644 => 100755 local-addons/merctrans_projects/demo/demo.xml mode change 100644 => 100755 local-addons/merctrans_projects/models/__init__.py mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc mode change 100644 => 100755 local-addons/merctrans_projects/models/merctrans_jobs.py mode change 100644 => 100755 local-addons/merctrans_projects/models/merctrans_projects.py mode change 100644 => 100755 local-addons/merctrans_projects/security/ir.model.access.csv mode change 100644 => 100755 local-addons/merctrans_projects/security/security.xml mode change 100644 => 100755 local-addons/merctrans_projects/security/security_rules.xml mode change 100644 => 100755 local-addons/merctrans_projects/tags mode change 100644 => 100755 local-addons/merctrans_projects/views/__init__.py mode change 100644 => 100755 local-addons/merctrans_projects/views/__manifest__.py mode change 100644 => 100755 local-addons/merctrans_projects/views/jobs.xml mode change 100644 => 100755 local-addons/merctrans_projects/views/projects_menus.xml mode change 100644 => 100755 local-addons/merctrans_projects/views/tags mode change 100644 => 100755 local-addons/merctrans_projects/views/templates.xml create mode 100644 tags diff --git a/.gitignore b/.gitignore index e69de29..43268df 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.pyc +odoo/ +odoo_pg_pass diff --git a/config/config.conf b/config/config.conf new file mode 100644 index 0000000..28f70c1 --- /dev/null +++ b/config/config.conf @@ -0,0 +1,37 @@ +[options] +addons_path = /mnt/extra-addons +data_dir = /var/lib/odoo +; admin_passwd = admin +; csv_internal_sep = , +; db_maxconn = 64 +; db_name = False +; db_template = template1 +; dbfilter = .* +; debug_mode = False +; email_from = False +; limit_memory_hard = 2684354560 +; limit_memory_soft = 2147483648 +; limit_request = 8192 +; limit_time_cpu = 60 +; limit_time_real = 120 +; list_db = True +; log_db = False +; log_handler = [':INFO'] +; log_level = info +; logfile = None +; longpolling_port = 8072 +; max_cron_threads = 2 +; osv_memory_age_limit = 1.0 +; osv_memory_count_limit = False +; smtp_password = False +; smtp_port = 25 +; smtp_server = localhost +; smtp_ssl = False +; smtp_user = False +; workers = 0 +; xmlrpc = True +; xmlrpc_interface = +; xmlrpc_port = 8069 +; xmlrpcs = True +; xmlrpcs_interface = +; xmlrpcs_port = 8071 diff --git a/config/odoo.conf b/config/odoo.conf new file mode 100644 index 0000000..005596b --- /dev/null +++ b/config/odoo.conf @@ -0,0 +1,60 @@ +[options] +addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons +admin_passwd = $pbkdf2-sha512$25000$hxCC8J4TAkCIMSZESKn1Pg$Qe46TFErfWPH4H8ATZgVx/ubLAOjaaXEPsOfxwOnirZceq.rpfFc7MYrhq0jj3C5XpAsr2jLD40IKeBZu7ZHog +csv_internal_sep = , +data_dir = /var/lib/odoo/.local/share/Odoo +db_host = db +db_maxconn = 64 +db_name = False +db_password = odoo +db_port = 5432 +db_sslmode = prefer +db_template = template0 +db_user = odoo +dbfilter = +demo = {} +email_from = False +geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb +http_enable = True +http_interface = +http_port = 8069 +import_partial = +limit_memory_hard = 2684354560 +limit_memory_soft = 2147483648 +limit_request = 8192 +limit_time_cpu = 60 +limit_time_real = 120 +limit_time_real_cron = -1 +list_db = True +log_db = False +log_db_level = warning +log_handler = :INFO +log_level = info +logfile = +longpolling_port = 8072 +max_cron_threads = 2 +osv_memory_age_limit = False +osv_memory_count_limit = False +pg_path = +pidfile = +proxy_mode = False +reportgz = False +screencasts = +screenshots = /tmp/odoo_tests +server_wide_modules = base,web +smtp_password = False +smtp_port = 25 +smtp_server = localhost +smtp_ssl = False +smtp_user = False +syslog = False +test_enable = False +test_file = +test_tags = None +transient_age_limit = 1.0 +translate_modules = ['all'] +unaccent = False +upgrade_path = +without_demo = False +workers = 0 + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..67cceab --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +version: "3.1" +services: + # web_test: + # image: odoo:14.0 + # depends_on: + # - db + # ports: + # - "8079:8079" + # volumes: + # - odoo-web-data:/var/lib/odoo + # - ./config:/etc/odoo + # - ./local-addons:/mnt/extra-addons + # environment: + # - password_file=/run/secrets/postgresql_password + # secrets: + # - postgresql_password + web_prod: + image: odoo:14.0 + depends_on: + - db + ports: + - "8069:8069" + volumes: + - odoo-web-data:/var/lib/odoo + - ./config:/etc/odoo + - ./local-addons:/mnt/extra-addons + environment: + - USER=odoo + - PASSWORD=odoo + secrets: + - postgresql_password + db: + image: postgres:13 + environment: + - POSTGRES_DB=postgres + - POSTGRES_PASSWORD=odoo + - POSTGRES_USER=odoo + - PGDATA=/var/lib/postgresql/data/pgdata + volumes: + - odoo-db-data:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password +volumes: + odoo-web-data: + odoo-db-data: + +secrets: + postgresql_password: + file: odoo_pg_pass diff --git a/local-addons/merctrans_projects/__init__.py b/local-addons/merctrans_projects/__init__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc b/local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/__init__.py b/local-addons/merctrans_projects/controllers/__init__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-39.pyc b/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-38.pyc b/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc b/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/controllers/controllers.py b/local-addons/merctrans_projects/controllers/controllers.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/demo/demo.xml b/local-addons/merctrans_projects/demo/demo.xml old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/security/security.xml b/local-addons/merctrans_projects/security/security.xml old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/security/security_rules.xml b/local-addons/merctrans_projects/security/security_rules.xml old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/tags b/local-addons/merctrans_projects/tags old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/__init__.py b/local-addons/merctrans_projects/views/__init__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/__manifest__.py b/local-addons/merctrans_projects/views/__manifest__.py old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/jobs.xml b/local-addons/merctrans_projects/views/jobs.xml old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/tags b/local-addons/merctrans_projects/views/tags old mode 100644 new mode 100755 diff --git a/local-addons/merctrans_projects/views/templates.xml b/local-addons/merctrans_projects/views/templates.xml old mode 100644 new mode 100755 diff --git a/tags b/tags new file mode 100644 index 0000000..dd08584 --- /dev/null +++ b/tags @@ -0,0 +1,176 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/ +!_TAG_OUTPUT_FILESEP slash /slash or backslash/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/ +!_TAG_PROC_CWD /Users/hglong/Projects/25_mt/ // +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 5.9.0 /b4f0dfbd/ +MercTransInvoices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransInvoices(models.Model):$/;" c +MercTransProjects local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransProjects(models.Model):$/;" c +MercTransServices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransServices(models.Model):$/;" c +MerctransJobs local-addons/merctrans_projects/models/merctrans_jobs.py /^class MerctransJobs(models.Model):$/;" c +_compute_invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ def _compute_invoice_value(self):$/;" m class:MercTransInvoices +_compute_job_value local-addons/merctrans_projects/models/merctrans_projects.py /^ def _compute_job_value(self):$/;" m class:MercTransProjects +_constraint_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _constraint_date(self):$/;" m class:MerctransJobs +_description local-addons/merctrans_projects/models/merctrans_jobs.py /^ _description = "Jobs by Projects"$/;" v class:MerctransJobs +_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'MercTrans Invoices for Project Managers'$/;" v class:MercTransInvoices +_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'MercTrans Projects'$/;" v class:MercTransProjects +_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'Services offered by MercTrans'$/;" v class:MercTransServices +_due_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _due_date_contrains(self):$/;" m class:MerctransJobs +_get_email_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_email_pic(self):$/;" m class:MerctransJobs +_get_id_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_id_pic(self):$/;" m class:MerctransJobs +_get_project_source local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_source(self):$/;" m class:MerctransJobs +_get_project_target local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_target(self):$/;" m class:MerctransJobs +_get_street_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_street_pic(self):$/;" m class:MerctransJobs +_name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _name = 'merctrans.jobs'$/;" v class:MerctransJobs +_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.invoices'$/;" v class:MercTransInvoices +_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.projects'$/;" v class:MercTransProjects +_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.services'$/;" v class:MercTransServices +_rec_name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _rec_name = "title"$/;" v class:MerctransJobs +_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'invoice_name'$/;" v class:MercTransInvoices +_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'job_name'$/;" v class:MercTransProjects +_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'services_names'$/;" v class:MercTransServices +_start_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _start_date_contrains(self):$/;" m class:MerctransJobs +addons_path config/config.conf /^addons_path = \/mnt\/extra-addons$/;" k section:options +addons_path config/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options +address local-addons/merctrans_projects/models/merctrans_jobs.py /^ address = fields.Char('Address',$/;" v class:MerctransJobs +admin_passwd config/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$hxCC8J4TAkCIMSZESKn1Pg$Qe46TFErfWPH4H8ATZgVx\/ubLAOjaaXEPsOf/;" k section:options +client local-addons/merctrans_projects/models/merctrans_projects.py /^ client = fields.Many2many('res.partner', string='Clients', required=True)$/;" v class:MercTransProjects +create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransInvoices +create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransProjects +csv_internal_sep config/odoo.conf /^csv_internal_sep = ,$/;" k section:options +currency_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def currency_constrains(self):$/;" m class:MercTransInvoices +currency_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MerctransJobs +currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransInvoices +currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransProjects +data_dir config/config.conf /^data_dir = \/var\/lib\/odoo$/;" k section:options +data_dir config/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options +date_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def date_constrains(self):$/;" m class:MercTransProjects +db_host config/odoo.conf /^db_host = db$/;" k section:options +db_maxconn config/odoo.conf /^db_maxconn = 64$/;" k section:options +db_name config/odoo.conf /^db_name = False$/;" k section:options +db_password config/odoo.conf /^db_password = odoo$/;" k section:options +db_port config/odoo.conf /^db_port = 5432$/;" k section:options +db_sslmode config/odoo.conf /^db_sslmode = prefer$/;" k section:options +db_template config/odoo.conf /^db_template = template0$/;" k section:options +db_user config/odoo.conf /^db_user = odoo$/;" k section:options +dbfilter config/odoo.conf /^dbfilter = $/;" k section:options +demo config/odoo.conf /^demo = {}$/;" k section:options +department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department",$/;" v class:MercTransServices +department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'),$/;" v class:MercTransServices +discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer('Discount (%)')$/;" v class:MercTransProjects +due_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MerctransJobs +due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MercTransProjects +email_from config/odoo.conf /^email_from = False$/;" k section:options +geoip_database config/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options +group_merctrans_contributor local-addons/merctrans_projects/security/security.xml /^ $/;" i +group_merctrans_pm local-addons/merctrans_projects/security/security.xml /^ $/;" i +http_enable config/odoo.conf /^http_enable = True$/;" k section:options +http_interface config/odoo.conf /^http_interface = $/;" k section:options +http_port config/odoo.conf /^http_port = 8069$/;" k section:options +import_partial config/odoo.conf /^import_partial = $/;" k section:options +invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner',$/;" v class:MercTransInvoices +invoice_date local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_date = fields.Date(string='Invoice Date')$/;" v class:MercTransInvoices +invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects',$/;" v class:MercTransInvoices +invoice_id local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_id = fields.Integer('Invoice ID')$/;" v class:MercTransInvoices +invoice_name local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_name = fields.Char('Invoice name')$/;" v class:MercTransInvoices +invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status",$/;" v class:MercTransInvoices +invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value",$/;" v class:MercTransInvoices +invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +job_id local-addons/merctrans_projects/models/merctrans_projects.py /^ job_id = fields.Integer('Project ID')$/;" v class:MercTransProjects +job_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ job_instruction = fields.Char('Project Instruction')$/;" v class:MercTransProjects +job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +job_view_form_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +job_view_tree local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +job_view_tree_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'),$/;" v class:MercTransProjects +limit_memory_hard config/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options +limit_memory_soft config/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options +limit_request config/odoo.conf /^limit_request = 8192$/;" k section:options +limit_time_cpu config/odoo.conf /^limit_time_cpu = 60$/;" k section:options +limit_time_real config/odoo.conf /^limit_time_real = 120$/;" k section:options +limit_time_real_cron config/odoo.conf /^limit_time_real_cron = -1$/;" k section:options +list_db config/odoo.conf /^list_db = True$/;" k section:options +log_db config/odoo.conf /^log_db = False$/;" k section:options +log_db_level config/odoo.conf /^log_db_level = warning$/;" k section:options +log_handler config/odoo.conf /^log_handler = :INFO$/;" k section:options +log_level config/odoo.conf /^log_level = info$/;" k section:options +logfile config/odoo.conf /^logfile = $/;" k section:options +longpolling_port config/odoo.conf /^longpolling_port = 8072$/;" k section:options +max_cron_threads config/odoo.conf /^max_cron_threads = 2$/;" k section:options +mectrans_jobs_user_rule local-addons/merctrans_projects/security/security_rules.xml /^ $/;" i +merctrans_invoices_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +merctrans_jobs_actions local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +merctrans_projects_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i +options config/config.conf /^[options]$/;" s +options config/odoo.conf /^[options]$/;" s +osv_memory_age_limit config/odoo.conf /^osv_memory_age_limit = False$/;" k section:options +osv_memory_count_limit config/odoo.conf /^osv_memory_count_limit = False$/;" k section:options +payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status',$/;" v class:MercTransProjects +payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'),$/;" v class:MercTransProjects +pg_path config/odoo.conf /^pg_path = $/;" k section:options +pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic = fields.Many2one('res.users', 'PIC', required=True)$/;" v class:MerctransJobs +pic_email local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_email = fields.Char('Email',$/;" v class:MerctransJobs +pic_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_id = fields.Char('Id',$/;" v class:MerctransJobs +pidfile config/odoo.conf /^pidfile = $/;" k section:options +project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs +project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users', string='Project Manager')$/;" v class:MercTransProjects +project_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +project_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +proxy_mode config/odoo.conf /^proxy_mode = False$/;" k section:options +reportgz config/odoo.conf /^reportgz = False$/;" k section:options +sale_rate_per_work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit')$/;" v class:MercTransProjects +screencasts config/odoo.conf /^screencasts = $/;" k section:options +screenshots config/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options +server_wide_modules config/odoo.conf /^server_wide_modules = base,web$/;" k section:options +services_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ services_ids = fields.Many2many('merctrans.services', string='Services')$/;" v class:MercTransProjects +services_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +smtp_password config/odoo.conf /^smtp_password = False$/;" k section:options +smtp_port config/odoo.conf /^smtp_port = 25$/;" k section:options +smtp_server config/odoo.conf /^smtp_server = localhost$/;" k section:options +smtp_ssl config/odoo.conf /^smtp_ssl = False$/;" k section:options +smtp_user config/odoo.conf /^smtp_user = False$/;" k section:options +source_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ source_language = fields.Char('Source Language',$/;" v class:MerctransJobs +source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages",$/;" v class:MercTransProjects +start_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MerctransJobs +start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MercTransProjects +status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'),$/;" v class:MercTransInvoices +sync_status local-addons/merctrans_projects/models/merctrans_projects.py /^ def sync_status(self):$/;" m class:MercTransInvoices +syslog config/odoo.conf /^syslog = False$/;" k section:options +target_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ target_language = fields.Char('Target Language',$/;" v class:MerctransJobs +target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language",$/;" v class:MercTransProjects +test_enable config/odoo.conf /^test_enable = False$/;" k section:options +test_file config/odoo.conf /^test_file = $/;" k section:options +test_tags config/odoo.conf /^test_tags = None$/;" k section:options +title local-addons/merctrans_projects/models/merctrans_jobs.py /^ title = fields.Char('Job Title', default='Job Title')$/;" v class:MerctransJobs +transient_age_limit config/odoo.conf /^transient_age_limit = 1.0$/;" k section:options +translate_modules config/odoo.conf /^translate_modules = ['all']$/;" k section:options +unaccent config/odoo.conf /^unaccent = False$/;" k section:options +upgrade_path config/odoo.conf /^upgrade_path = $/;" k section:options +volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer('Project Volume')$/;" v class:MercTransProjects +without_demo config/odoo.conf /^without_demo = False$/;" k section:options +work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit', selection=work_unit_list)$/;" v class:MercTransProjects +work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'),$/;" v class:MercTransProjects +workers config/odoo.conf /^workers = 0$/;" k section:options +write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransInvoices +write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransProjects From 7e8c56a3647584b7714e97bd49112aa509390575 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 9 Jun 2022 15:57:53 +0700 Subject: [PATCH 02/74] fix docker, add staging --- config-test/odoo.conf | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 config-test/odoo.conf diff --git a/config-test/odoo.conf b/config-test/odoo.conf new file mode 100644 index 0000000..3751a21 --- /dev/null +++ b/config-test/odoo.conf @@ -0,0 +1,60 @@ +[options] +addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons +admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6Xn7wPaHISvuNqzPAia5ltfU29FMsWNXOPo29vGMgH6bw3G9fBA +csv_internal_sep = , +data_dir = /var/lib/odoo/.local/share/Odoo +db_host = db_test +db_maxconn = 64 +db_name = merctrans_test +db_password = odoo +db_port = 5432 +db_sslmode = prefer +db_template = template0 +db_user = odoo +dbfilter = +demo = {} +email_from = hoanglong@spiderum.com +geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb +http_enable = True +http_interface = +http_port = 8069 +import_partial = +limit_memory_hard = 2684354560 +limit_memory_soft = 2147483648 +limit_request = 8192 +limit_time_cpu = 60 +limit_time_real = 120 +limit_time_real_cron = -1 +list_db = False +log_db = False +log_db_level = warning +log_handler = :INFO +log_level = info +logfile = +longpolling_port = 8072 +max_cron_threads = 2 +osv_memory_age_limit = False +osv_memory_count_limit = False +pg_path = +pidfile = +proxy_mode = False +reportgz = False +screencasts = +screenshots = /tmp/odoo_tests +server_wide_modules = base,web +smtp_password = False +smtp_port = 25 +smtp_server = localhost +smtp_ssl = False +smtp_user = False +syslog = False +test_enable = False +test_file = +test_tags = None +transient_age_limit = 1.0 +translate_modules = ['all'] +unaccent = False +upgrade_path = +without_demo = True +workers = 0 + From 71df66a1065abd38542aa64a9423ddf8ccc4d5ff Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 9 Jun 2022 16:05:32 +0700 Subject: [PATCH 03/74] add test_server --- config/config.conf | 37 ---------- config/odoo.conf | 12 +-- docker-compose.yml | 43 +++++++---- .../merctrans_projects/__manifest__.py | 2 +- tags | 74 ++++++++++++++++--- 5 files changed, 101 insertions(+), 67 deletions(-) delete mode 100644 config/config.conf diff --git a/config/config.conf b/config/config.conf deleted file mode 100644 index 28f70c1..0000000 --- a/config/config.conf +++ /dev/null @@ -1,37 +0,0 @@ -[options] -addons_path = /mnt/extra-addons -data_dir = /var/lib/odoo -; admin_passwd = admin -; csv_internal_sep = , -; db_maxconn = 64 -; db_name = False -; db_template = template1 -; dbfilter = .* -; debug_mode = False -; email_from = False -; limit_memory_hard = 2684354560 -; limit_memory_soft = 2147483648 -; limit_request = 8192 -; limit_time_cpu = 60 -; limit_time_real = 120 -; list_db = True -; log_db = False -; log_handler = [':INFO'] -; log_level = info -; logfile = None -; longpolling_port = 8072 -; max_cron_threads = 2 -; osv_memory_age_limit = 1.0 -; osv_memory_count_limit = False -; smtp_password = False -; smtp_port = 25 -; smtp_server = localhost -; smtp_ssl = False -; smtp_user = False -; workers = 0 -; xmlrpc = True -; xmlrpc_interface = -; xmlrpc_port = 8069 -; xmlrpcs = True -; xmlrpcs_interface = -; xmlrpcs_port = 8071 diff --git a/config/odoo.conf b/config/odoo.conf index 005596b..77af2fc 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -1,19 +1,19 @@ [options] addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons -admin_passwd = $pbkdf2-sha512$25000$hxCC8J4TAkCIMSZESKn1Pg$Qe46TFErfWPH4H8ATZgVx/ubLAOjaaXEPsOfxwOnirZceq.rpfFc7MYrhq0jj3C5XpAsr2jLD40IKeBZu7ZHog +admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6Xn7wPaHISvuNqzPAia5ltfU29FMsWNXOPo29vGMgH6bw3G9fBA csv_internal_sep = , data_dir = /var/lib/odoo/.local/share/Odoo db_host = db db_maxconn = 64 -db_name = False +db_name = merctrans db_password = odoo db_port = 5432 db_sslmode = prefer db_template = template0 db_user = odoo dbfilter = -demo = {} -email_from = False +demo = False +email_from = hoanglong@spiderum.com geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb http_enable = True http_interface = @@ -25,7 +25,7 @@ limit_request = 8192 limit_time_cpu = 60 limit_time_real = 120 limit_time_real_cron = -1 -list_db = True +list_db = False log_db = False log_db_level = warning log_handler = :INFO @@ -55,6 +55,6 @@ transient_age_limit = 1.0 translate_modules = ['all'] unaccent = False upgrade_path = -without_demo = False +without_demo = True workers = 0 diff --git a/docker-compose.yml b/docker-compose.yml index 67cceab..f44f4f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,19 +1,5 @@ version: "3.1" services: - # web_test: - # image: odoo:14.0 - # depends_on: - # - db - # ports: - # - "8079:8079" - # volumes: - # - odoo-web-data:/var/lib/odoo - # - ./config:/etc/odoo - # - ./local-addons:/mnt/extra-addons - # environment: - # - password_file=/run/secrets/postgresql_password - # secrets: - # - postgresql_password web_prod: image: odoo:14.0 depends_on: @@ -40,9 +26,38 @@ services: - odoo-db-data:/var/lib/postgresql/data/pgdata secrets: - postgresql_password + web_test: + image: odoo:14.0 + depends_on: + - db_test + ports: + - "8079:8069" + volumes: + - odoo-web-data-test:/var/lib/odoo + - ./config-test:/etc/odoo + - ./local-addons:/mnt/extra-addons + environment: + - USER=odoo + - PASSWORD=odoo + db_test: + image: postgres:13 + environment: + - POSTGRES_DB=postgres + - POSTGRES_PASSWORD=odoo + - POSTGRES_USER=odoo + - PGDATA=/var/lib/postgresql/data/pgdata + ports: + - 5435:5432 + volumes: + - odoo-db-data-test:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password + volumes: odoo-web-data: odoo-db-data: + odoo-web-data-test: + odoo-db-data-test: secrets: postgresql_password: diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index dd46ea0..0fc66c4 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -34,10 +34,10 @@ 'security/security_rules.xml', 'security/ir.model.access.csv', # View <> + 'views/jobs.xml', 'views/projects_menus.xml', 'views/templates.xml', # 'views/sale.xml', - 'views/jobs.xml' ], # only loaded in demonstration mode 'demo': [ diff --git a/tags b/tags index dd08584..4101776 100644 --- a/tags +++ b/tags @@ -35,43 +35,61 @@ _rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _re _rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'job_name'$/;" v class:MercTransProjects _rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'services_names'$/;" v class:MercTransServices _start_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _start_date_contrains(self):$/;" m class:MerctransJobs -addons_path config/config.conf /^addons_path = \/mnt\/extra-addons$/;" k section:options +addons_path config-test/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options addons_path config/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options address local-addons/merctrans_projects/models/merctrans_jobs.py /^ address = fields.Char('Address',$/;" v class:MerctransJobs -admin_passwd config/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$hxCC8J4TAkCIMSZESKn1Pg$Qe46TFErfWPH4H8ATZgVx\/ubLAOjaaXEPsOf/;" k section:options +admin_passwd config-test/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$\/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6/;" k section:options +admin_passwd config/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$\/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6/;" k section:options client local-addons/merctrans_projects/models/merctrans_projects.py /^ client = fields.Many2many('res.partner', string='Clients', required=True)$/;" v class:MercTransProjects create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransInvoices create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransProjects +csv_internal_sep config-test/odoo.conf /^csv_internal_sep = ,$/;" k section:options csv_internal_sep config/odoo.conf /^csv_internal_sep = ,$/;" k section:options currency_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def currency_constrains(self):$/;" m class:MercTransInvoices currency_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MerctransJobs currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransInvoices currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransProjects -data_dir config/config.conf /^data_dir = \/var\/lib\/odoo$/;" k section:options +data_dir config-test/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options data_dir config/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options date_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def date_constrains(self):$/;" m class:MercTransProjects +db_host config-test/odoo.conf /^db_host = db_test$/;" k section:options db_host config/odoo.conf /^db_host = db$/;" k section:options +db_maxconn config-test/odoo.conf /^db_maxconn = 64$/;" k section:options db_maxconn config/odoo.conf /^db_maxconn = 64$/;" k section:options -db_name config/odoo.conf /^db_name = False$/;" k section:options +db_name config-test/odoo.conf /^db_name = merctrans_test$/;" k section:options +db_name config/odoo.conf /^db_name = merctrans$/;" k section:options +db_password config-test/odoo.conf /^db_password = odoo$/;" k section:options db_password config/odoo.conf /^db_password = odoo$/;" k section:options +db_port config-test/odoo.conf /^db_port = 5432$/;" k section:options db_port config/odoo.conf /^db_port = 5432$/;" k section:options +db_sslmode config-test/odoo.conf /^db_sslmode = prefer$/;" k section:options db_sslmode config/odoo.conf /^db_sslmode = prefer$/;" k section:options +db_template config-test/odoo.conf /^db_template = template0$/;" k section:options db_template config/odoo.conf /^db_template = template0$/;" k section:options +db_user config-test/odoo.conf /^db_user = odoo$/;" k section:options db_user config/odoo.conf /^db_user = odoo$/;" k section:options +dbfilter config-test/odoo.conf /^dbfilter = $/;" k section:options dbfilter config/odoo.conf /^dbfilter = $/;" k section:options -demo config/odoo.conf /^demo = {}$/;" k section:options +demo config-test/odoo.conf /^demo = {}$/;" k section:options +demo config/odoo.conf /^demo = False$/;" k section:options department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department",$/;" v class:MercTransServices department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'),$/;" v class:MercTransServices discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer('Discount (%)')$/;" v class:MercTransProjects due_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MerctransJobs due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MercTransProjects -email_from config/odoo.conf /^email_from = False$/;" k section:options +email_from config-test/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options +email_from config/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options +geoip_database config-test/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options geoip_database config/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options group_merctrans_contributor local-addons/merctrans_projects/security/security.xml /^ $/;" i group_merctrans_pm local-addons/merctrans_projects/security/security.xml /^ $/;" i +http_enable config-test/odoo.conf /^http_enable = True$/;" k section:options http_enable config/odoo.conf /^http_enable = True$/;" k section:options +http_interface config-test/odoo.conf /^http_interface = $/;" k section:options http_interface config/odoo.conf /^http_interface = $/;" k section:options +http_port config-test/odoo.conf /^http_port = 8069$/;" k section:options http_port config/odoo.conf /^http_port = 8069$/;" k section:options +import_partial config-test/odoo.conf /^import_partial = $/;" k section:options import_partial config/odoo.conf /^import_partial = $/;" k section:options invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner',$/;" v class:MercTransInvoices invoice_date local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_date = fields.Date(string='Invoice Date')$/;" v class:MercTransInvoices @@ -94,19 +112,33 @@ job_view_form_in_base_menu local-addons/merctrans_projects/views/projects_menus. job_view_tree local-addons/merctrans_projects/views/jobs.xml /^ $/;" i job_view_tree_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'),$/;" v class:MercTransProjects +limit_memory_hard config-test/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options limit_memory_hard config/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options +limit_memory_soft config-test/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options limit_memory_soft config/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options +limit_request config-test/odoo.conf /^limit_request = 8192$/;" k section:options limit_request config/odoo.conf /^limit_request = 8192$/;" k section:options +limit_time_cpu config-test/odoo.conf /^limit_time_cpu = 60$/;" k section:options limit_time_cpu config/odoo.conf /^limit_time_cpu = 60$/;" k section:options +limit_time_real config-test/odoo.conf /^limit_time_real = 120$/;" k section:options limit_time_real config/odoo.conf /^limit_time_real = 120$/;" k section:options +limit_time_real_cron config-test/odoo.conf /^limit_time_real_cron = -1$/;" k section:options limit_time_real_cron config/odoo.conf /^limit_time_real_cron = -1$/;" k section:options -list_db config/odoo.conf /^list_db = True$/;" k section:options +list_db config-test/odoo.conf /^list_db = False$/;" k section:options +list_db config/odoo.conf /^list_db = False$/;" k section:options +log_db config-test/odoo.conf /^log_db = False$/;" k section:options log_db config/odoo.conf /^log_db = False$/;" k section:options +log_db_level config-test/odoo.conf /^log_db_level = warning$/;" k section:options log_db_level config/odoo.conf /^log_db_level = warning$/;" k section:options +log_handler config-test/odoo.conf /^log_handler = :INFO$/;" k section:options log_handler config/odoo.conf /^log_handler = :INFO$/;" k section:options +log_level config-test/odoo.conf /^log_level = info$/;" k section:options log_level config/odoo.conf /^log_level = info$/;" k section:options +logfile config-test/odoo.conf /^logfile = $/;" k section:options logfile config/odoo.conf /^logfile = $/;" k section:options +longpolling_port config-test/odoo.conf /^longpolling_port = 8072$/;" k section:options longpolling_port config/odoo.conf /^longpolling_port = 8072$/;" k section:options +max_cron_threads config-test/odoo.conf /^max_cron_threads = 2$/;" k section:options max_cron_threads config/odoo.conf /^max_cron_threads = 2$/;" k section:options mectrans_jobs_user_rule local-addons/merctrans_projects/security/security_rules.xml /^ $/;" i merctrans_invoices_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i @@ -115,16 +147,20 @@ merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i -options config/config.conf /^[options]$/;" s +options config-test/odoo.conf /^[options]$/;" s options config/odoo.conf /^[options]$/;" s +osv_memory_age_limit config-test/odoo.conf /^osv_memory_age_limit = False$/;" k section:options osv_memory_age_limit config/odoo.conf /^osv_memory_age_limit = False$/;" k section:options +osv_memory_count_limit config-test/odoo.conf /^osv_memory_count_limit = False$/;" k section:options osv_memory_count_limit config/odoo.conf /^osv_memory_count_limit = False$/;" k section:options payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status',$/;" v class:MercTransProjects payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'),$/;" v class:MercTransProjects +pg_path config-test/odoo.conf /^pg_path = $/;" k section:options pg_path config/odoo.conf /^pg_path = $/;" k section:options pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic = fields.Many2one('res.users', 'PIC', required=True)$/;" v class:MerctransJobs pic_email local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_email = fields.Char('Email',$/;" v class:MerctransJobs pic_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_id = fields.Char('Id',$/;" v class:MerctransJobs +pidfile config-test/odoo.conf /^pidfile = $/;" k section:options pidfile config/odoo.conf /^pidfile = $/;" k section:options project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs @@ -135,20 +171,30 @@ project_status_list local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ project_status_list = [('potential', 'Potential'),$/;" v class:MercTransProjects project_view_form local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +proxy_mode config-test/odoo.conf /^proxy_mode = False$/;" k section:options proxy_mode config/odoo.conf /^proxy_mode = False$/;" k section:options +reportgz config-test/odoo.conf /^reportgz = False$/;" k section:options reportgz config/odoo.conf /^reportgz = False$/;" k section:options sale_rate_per_work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit')$/;" v class:MercTransProjects +screencasts config-test/odoo.conf /^screencasts = $/;" k section:options screencasts config/odoo.conf /^screencasts = $/;" k section:options +screenshots config-test/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options screenshots config/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options +server_wide_modules config-test/odoo.conf /^server_wide_modules = base,web$/;" k section:options server_wide_modules config/odoo.conf /^server_wide_modules = base,web$/;" k section:options services_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ services_ids = fields.Many2many('merctrans.services', string='Services')$/;" v class:MercTransProjects services_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +smtp_password config-test/odoo.conf /^smtp_password = False$/;" k section:options smtp_password config/odoo.conf /^smtp_password = False$/;" k section:options +smtp_port config-test/odoo.conf /^smtp_port = 25$/;" k section:options smtp_port config/odoo.conf /^smtp_port = 25$/;" k section:options +smtp_server config-test/odoo.conf /^smtp_server = localhost$/;" k section:options smtp_server config/odoo.conf /^smtp_server = localhost$/;" k section:options +smtp_ssl config-test/odoo.conf /^smtp_ssl = False$/;" k section:options smtp_ssl config/odoo.conf /^smtp_ssl = False$/;" k section:options +smtp_user config-test/odoo.conf /^smtp_user = False$/;" k section:options smtp_user config/odoo.conf /^smtp_user = False$/;" k section:options source_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ source_language = fields.Char('Source Language',$/;" v class:MerctransJobs source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages",$/;" v class:MercTransProjects @@ -156,21 +202,31 @@ start_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ start_ start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MercTransProjects status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'),$/;" v class:MercTransInvoices sync_status local-addons/merctrans_projects/models/merctrans_projects.py /^ def sync_status(self):$/;" m class:MercTransInvoices +syslog config-test/odoo.conf /^syslog = False$/;" k section:options syslog config/odoo.conf /^syslog = False$/;" k section:options target_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ target_language = fields.Char('Target Language',$/;" v class:MerctransJobs target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language",$/;" v class:MercTransProjects +test_enable config-test/odoo.conf /^test_enable = False$/;" k section:options test_enable config/odoo.conf /^test_enable = False$/;" k section:options +test_file config-test/odoo.conf /^test_file = $/;" k section:options test_file config/odoo.conf /^test_file = $/;" k section:options +test_tags config-test/odoo.conf /^test_tags = None$/;" k section:options test_tags config/odoo.conf /^test_tags = None$/;" k section:options title local-addons/merctrans_projects/models/merctrans_jobs.py /^ title = fields.Char('Job Title', default='Job Title')$/;" v class:MerctransJobs +transient_age_limit config-test/odoo.conf /^transient_age_limit = 1.0$/;" k section:options transient_age_limit config/odoo.conf /^transient_age_limit = 1.0$/;" k section:options +translate_modules config-test/odoo.conf /^translate_modules = ['all']$/;" k section:options translate_modules config/odoo.conf /^translate_modules = ['all']$/;" k section:options +unaccent config-test/odoo.conf /^unaccent = False$/;" k section:options unaccent config/odoo.conf /^unaccent = False$/;" k section:options +upgrade_path config-test/odoo.conf /^upgrade_path = $/;" k section:options upgrade_path config/odoo.conf /^upgrade_path = $/;" k section:options volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer('Project Volume')$/;" v class:MercTransProjects -without_demo config/odoo.conf /^without_demo = False$/;" k section:options +without_demo config-test/odoo.conf /^without_demo = True$/;" k section:options +without_demo config/odoo.conf /^without_demo = True$/;" k section:options work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit', selection=work_unit_list)$/;" v class:MercTransProjects work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'),$/;" v class:MercTransProjects +workers config-test/odoo.conf /^workers = 0$/;" k section:options workers config/odoo.conf /^workers = 0$/;" k section:options write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransInvoices write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransProjects From f4d6eaa30ac435bb845cff04048752e1e28743ff Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 28 Jun 2022 22:58:26 +0700 Subject: [PATCH 04/74] show valid date --- .gitignore | 1 + .../models/merctrans_jobs.py | 14 +- .../models/merctrans_projects.py | 87 ++++--------- .../merctrans_projects/views/jobs.xml | 121 +++++++++--------- tags | 46 ++++--- 5 files changed, 127 insertions(+), 142 deletions(-) diff --git a/.gitignore b/.gitignore index 43268df..c4b3bf8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__/ *.pyc odoo/ odoo_pg_pass +.idea diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py index 0b9c4cb..be9f815 100755 --- a/local-addons/merctrans_projects/models/merctrans_jobs.py +++ b/local-addons/merctrans_projects/models/merctrans_jobs.py @@ -25,7 +25,6 @@ class MerctransJobs(models.Model): store=True, readonly=True, compute='_get_id_pic') - pic_email = fields.Char('Email', store=True, readonly=True, @@ -40,6 +39,10 @@ class MerctransJobs(models.Model): readonly=True, compute='_get_project_target') currency_id = fields.Many2one('res.currency', string='Currency') + valid_date = fields.Char('Valid Date', + default="Choose Project", + readonly=True, + compute='_get_project_valid_date') start_date = fields.Date(string='Start Date') due_date = fields.Date(string='Due Date') @@ -89,6 +92,15 @@ def _get_id_pic(self): def _get_project_source(self): self.source_language = self.project_id.source_language + @api.onchange('project_id') + @api.depends('project_id') + def _get_project_valid_date(self): + for project in self: + if project.project_id.start_date: + project.valid_date = f"{project.project_id.start_date} >> {project.project_id.due_date}" + else: + project.valid_date = "Choose Project" + @api.onchange('project_id') @api.depends('project_id') def _get_project_target(self): diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index b995716..f1fe8d2 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -8,11 +8,8 @@ class MercTransServices(models.Model): _rec_name = 'services_names' _description = 'Services offered by MercTrans' - department_list = [('localization', 'Localization'), - ('marketing', 'Marketing'), - ('developement', 'Development')] - department = fields.Selection(string="Department", - selection=department_list) + department_list = [('localization', 'Localization'), ('marketing', 'Marketing'), ('developement', 'Development')] + department = fields.Selection(string="Department", selection=department_list) services_names = fields.Char('Services') @@ -21,30 +18,19 @@ class MercTransProjects(models.Model): _description = 'MercTrans Projects' _rec_name = 'job_name' - language_list = [('zh-CN', 'Chinese (Simplified)'), - ('zh-TW', 'Chinese (Traditional)'), - ('en-US', 'English (US)'), ('en-GB', 'English (UK)'), - ('fr-FR', 'French'), ('it-IT', 'Italian'), - ('es-ES', 'Spanish (Spain)'), - ('es-AR', 'Spanish (Argentina)'), - ('es-LA', 'Spanish (Latin America)'), ('th-TH', 'Thai'), - ('tr-TR', 'Turkish'), ('vi-VN', 'Vietnamese'), - ('ko-KR', 'Korean'), ('ja-JP', 'Japanese'), - ('ru-RU', 'Russian'), ('de-DE', 'German (Germany)'), - ('de-AT', 'German (Austria)'), + language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), ('en-US', 'English (US)'), + ('en-GB', 'English (UK)'), ('fr-FR', 'French'), ('it-IT', 'Italian'), ('es-ES', 'Spanish (Spain)'), + ('es-AR', 'Spanish (Argentina)'), ('es-LA', 'Spanish (Latin America)'), ('th-TH', 'Thai'), + ('tr-TR', 'Turkish'), ('vi-VN', 'Vietnamese'), ('ko-KR', 'Korean'), ('ja-JP', 'Japanese'), + ('ru-RU', 'Russian'), ('de-DE', 'German (Germany)'), ('de-AT', 'German (Austria)'), ('de-CH', 'German (Switzerland)')] - work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), - ('job', 'Job')] + work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), ('job', 'Job')] - project_status_list = [('potential', 'Potential'), - ('confirmed', 'Confirmed'), - ('in progress', 'In Progress'), ('in qa', 'In QA'), - ('delivered', 'Delivered'), - ('canceled', 'Canceled')] + project_status_list = [('potential', 'Potential'), ('confirmed', 'Confirmed'), ('in progress', 'In Progress'), + ('in qa', 'In QA'), ('delivered', 'Delivered'), ('canceled', 'Canceled')] - payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), - ('paid', 'Paid')] + payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] job_id = fields.Integer('Project ID') job_name = fields.Char('Project Name', default='Project Name') @@ -53,12 +39,8 @@ class MercTransProjects(models.Model): # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') job_instruction = fields.Char('Project Instruction') - source_language = fields.Selection(string="Source Languages", - selection=language_list, - default="Select a language") - target_language = fields.Selection(string="Target Language", - selection=language_list, - default="Select a language") + source_language = fields.Selection(string="Source Languages", selection=language_list, default="Select a language") + target_language = fields.Selection(string="Target Language", selection=language_list, default="Select a language") discount = fields.Integer('Discount (%)') # add discount field # fixed job @@ -68,19 +50,14 @@ class MercTransProjects(models.Model): currency_id = fields.Many2one('res.currency', string='Currency') sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit') # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') - job_value = fields.Monetary("Job Value", - compute="_compute_job_value", - currency_field='currency_id', - store=True, + job_value = fields.Monetary("Job Value", compute="_compute_job_value", currency_field='currency_id', store=True, readonly=True) project_manager = fields.Many2one('res.users', string='Project Manager') start_date = fields.Date(string='Start Date') due_date = fields.Date(string='Due Date') - project_status = fields.Selection(string='Project Status', - selection=project_status_list) - payment_status = fields.Selection(string='Payment Status', - selection=payment_status_list) + project_status = fields.Selection(string='Project Status', selection=project_status_list) + payment_status = fields.Selection(string='Payment Status', selection=payment_status_list) @api.model def create(self, vals): @@ -95,16 +72,13 @@ def write(self, vals): @api.depends('volume', 'sale_rate_per_work_unit', 'discount') def _compute_job_value(self): for project in self: - project.job_value = ( - 100 - project.discount - ) / 100 * project.volume * project.sale_rate_per_work_unit + project.job_value = (100 - project.discount) / 100 * project.volume * project.sale_rate_per_work_unit @api.constrains('start_date', 'due_date') def date_constrains(self): for project in self: if project.due_date < project.start_date: - raise ValidationError( - 'Due date must be greater than Start date!') + raise ValidationError('Due date must be greater than Start date!') class MercTransInvoices(models.Model): @@ -112,38 +86,29 @@ class MercTransInvoices(models.Model): _rec_name = 'invoice_name' _description = 'MercTrans Invoices for Project Managers' - status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), - ('unpaid', 'Unpaid')] + status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), ('unpaid', 'Unpaid')] invoice_id = fields.Integer('Invoice ID') invoice_name = fields.Char('Invoice name') invoice_date = fields.Date(string='Invoice Date') - invoice_client = fields.Many2one('res.partner', - string='Client', - required='True') - invoice_details_ids = fields.Many2many('merctrans.projects', - string='Invoice Lines') + invoice_client = fields.Many2one('res.partner', string='Client', required='True') + invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines') currency_id = fields.Many2one('res.currency', string='Currency') - invoice_value = fields.Monetary("Invoice Value", - compute="_compute_invoice_value", - currency_field='currency_id') + invoice_value = fields.Monetary("Invoice Value", compute="_compute_invoice_value", currency_field='currency_id') # invoice_details_ids = fields.Many2many('merctrans.invoices.lines', 'job_id', string="Invoice Lines") - invoice_status = fields.Selection(string="Invoice Status", - selection=status_list) + invoice_status = fields.Selection(string="Invoice Status", selection=status_list) @api.depends('invoice_details_ids') def _compute_invoice_value(self): for item in self: - item.invoice_value = sum(x.job_value - for x in item.invoice_details_ids) + item.invoice_value = sum(x.job_value for x in item.invoice_details_ids) @api.constrains('invoice_details_ids') def currency_constrains(self): for job in self: for x in job.invoice_details_ids: if job.currency_id != x.currency_id: - raise ValidationError( - 'Job currency must be the same as invoice currency!') + raise ValidationError('Job currency must be the same as invoice currency!') @api.model def create(self, vals): @@ -156,7 +121,7 @@ def write(self, vals): @api.onchange('invoice_status') def sync_status(self): - + for project in self.invoice_details_ids: if self.invoice_status == 'paid': project.write({'payment_status': 'paid'}) diff --git a/local-addons/merctrans_projects/views/jobs.xml b/local-addons/merctrans_projects/views/jobs.xml index 15fc01a..62c8760 100755 --- a/local-addons/merctrans_projects/views/jobs.xml +++ b/local-addons/merctrans_projects/views/jobs.xml @@ -1,68 +1,69 @@ - - Merctrans Job List - merctrans.jobs - tree,form - - - + + Merctrans Job List + merctrans.jobs + tree,form + + + - - - Job Form - merctrans.jobs - -
- - - - - - - - - - - - - - - - - - -
-
-
+ + + Job Form + merctrans.jobs + +
+ + + + + + + + + + + + + + + + + + + +
+
+
- - - Job Tree - merctrans.jobs - - - - - - - - - - - + + + Job Tree + merctrans.jobs + + + + + + + + + + + - - + + - - - - Job Search - merctrans.jobs - - - + + + + Job Search + merctrans.jobs + + + - +
diff --git a/tags b/tags index 4101776..46de97d 100644 --- a/tags +++ b/tags @@ -9,6 +9,10 @@ !_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ !_TAG_PROGRAM_URL https://ctags.io/ /official site/ !_TAG_PROGRAM_VERSION 5.9.0 /b4f0dfbd/ +2BCVbB9y7f8wisPqUL52mPxrYD9 .idea/workspace.xml /^ $/;" i +48aa5e45-b265-4e4f-b5e6-7676a3d0cd8b .idea/workspace.xml /^ $/;" i +48aa5e45-b265-4e4f-b5e6-7676a3d0cd8b .idea/workspace.xml /^ $/;" i +Default .idea/workspace.xml /^ $/;" i MercTransInvoices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransInvoices(models.Model):$/;" c MercTransProjects local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransProjects(models.Model):$/;" c MercTransServices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransServices(models.Model):$/;" c @@ -25,6 +29,7 @@ _get_email_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ de _get_id_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_id_pic(self):$/;" m class:MerctransJobs _get_project_source local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_source(self):$/;" m class:MerctransJobs _get_project_target local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_target(self):$/;" m class:MerctransJobs +_get_project_valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_valid_date(self):$/;" m class:MerctransJobs _get_street_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_street_pic(self):$/;" m class:MerctransJobs _name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _name = 'merctrans.jobs'$/;" v class:MerctransJobs _name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.invoices'$/;" v class:MercTransInvoices @@ -72,8 +77,8 @@ dbfilter config-test/odoo.conf /^dbfilter = $/;" k section:options dbfilter config/odoo.conf /^dbfilter = $/;" k section:options demo config-test/odoo.conf /^demo = {}$/;" k section:options demo config/odoo.conf /^demo = False$/;" k section:options -department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department",$/;" v class:MercTransServices -department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'),$/;" v class:MercTransServices +department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department", selection=department_list)$/;" v class:MercTransServices +department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'), ('marketing', 'Marketing'), ('developem/;" v class:MercTransServices discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer('Discount (%)')$/;" v class:MercTransProjects due_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MerctransJobs due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MercTransProjects @@ -91,13 +96,13 @@ http_port config-test/odoo.conf /^http_port = 8069$/;" k section:options http_port config/odoo.conf /^http_port = 8069$/;" k section:options import_partial config-test/odoo.conf /^import_partial = $/;" k section:options import_partial config/odoo.conf /^import_partial = $/;" k section:options -invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner',$/;" v class:MercTransInvoices +invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner', string='Client', required='True')$/;" v class:MercTransInvoices invoice_date local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_date = fields.Date(string='Invoice Date')$/;" v class:MercTransInvoices -invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects',$/;" v class:MercTransInvoices +invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines')$/;" v class:MercTransInvoices invoice_id local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_id = fields.Integer('Invoice ID')$/;" v class:MercTransInvoices invoice_name local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_name = fields.Char('Invoice name')$/;" v class:MercTransInvoices -invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status",$/;" v class:MercTransInvoices -invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value",$/;" v class:MercTransInvoices +invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status", selection=status_list)$/;" v class:MercTransInvoices +invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value", compute="_compute_invoice_value", currency_/;" v class:MercTransInvoices invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i @@ -106,12 +111,12 @@ job_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +job_value local-addons/merctrans_projects/models/merctrans_projects.py /^ job_value = fields.Monetary("Job Value", compute="_compute_job_value", currency_field='curre/;" v class:MercTransProjects +job_view_form local-addons/merctrans_projects/views/jobs.xml /^ $/;" i job_view_form_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_view_tree local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +job_view_tree local-addons/merctrans_projects/views/jobs.xml /^ $/;" i job_view_tree_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'),$/;" v class:MercTransProjects +language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), ('en/;" v class:MercTransProjects limit_memory_hard config-test/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options limit_memory_hard config/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options limit_memory_soft config-test/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options @@ -142,8 +147,8 @@ max_cron_threads config-test/odoo.conf /^max_cron_threads = 2$/;" k section:opti max_cron_threads config/odoo.conf /^max_cron_threads = 2$/;" k section:options mectrans_jobs_user_rule local-addons/merctrans_projects/security/security_rules.xml /^ $/;" i merctrans_invoices_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -merctrans_jobs_actions local-addons/merctrans_projects/views/jobs.xml /^ $/;" i -merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +merctrans_jobs_actions local-addons/merctrans_projects/views/jobs.xml /^ $/;" i +merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i merctrans_projects_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i @@ -153,8 +158,8 @@ osv_memory_age_limit config-test/odoo.conf /^osv_memory_age_limit = False$/;" k osv_memory_age_limit config/odoo.conf /^osv_memory_age_limit = False$/;" k section:options osv_memory_count_limit config-test/odoo.conf /^osv_memory_count_limit = False$/;" k section:options osv_memory_count_limit config/odoo.conf /^osv_memory_count_limit = False$/;" k section:options -payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status',$/;" v class:MercTransProjects -payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'),$/;" v class:MercTransProjects +payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status', selection=payment_status_list)$/;" v class:MercTransProjects +payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')]$/;" v class:MercTransProjects pg_path config-test/odoo.conf /^pg_path = $/;" k section:options pg_path config/odoo.conf /^pg_path = $/;" k section:options pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic = fields.Many2one('res.users', 'PIC', required=True)$/;" v class:MerctransJobs @@ -166,9 +171,9 @@ project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users', string='Project Manager')$/;" v class:MercTransProjects project_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i proxy_mode config-test/odoo.conf /^proxy_mode = False$/;" k section:options @@ -197,15 +202,15 @@ smtp_ssl config/odoo.conf /^smtp_ssl = False$/;" k section:options smtp_user config-test/odoo.conf /^smtp_user = False$/;" k section:options smtp_user config/odoo.conf /^smtp_user = False$/;" k section:options source_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ source_language = fields.Char('Source Language',$/;" v class:MerctransJobs -source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages",$/;" v class:MercTransProjects +source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages", selection=language_list, defau/;" v class:MercTransProjects start_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MerctransJobs start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MercTransProjects -status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'),$/;" v class:MercTransInvoices +status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), ('unpaid', 'Unpaid')]$/;" v class:MercTransInvoices sync_status local-addons/merctrans_projects/models/merctrans_projects.py /^ def sync_status(self):$/;" m class:MercTransInvoices syslog config-test/odoo.conf /^syslog = False$/;" k section:options syslog config/odoo.conf /^syslog = False$/;" k section:options target_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ target_language = fields.Char('Target Language',$/;" v class:MerctransJobs -target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language",$/;" v class:MercTransProjects +target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language", selection=language_list, defaul/;" v class:MercTransProjects test_enable config-test/odoo.conf /^test_enable = False$/;" k section:options test_enable config/odoo.conf /^test_enable = False$/;" k section:options test_file config-test/odoo.conf /^test_file = $/;" k section:options @@ -221,11 +226,12 @@ unaccent config-test/odoo.conf /^unaccent = False$/;" k section:options unaccent config/odoo.conf /^unaccent = False$/;" k section:options upgrade_path config-test/odoo.conf /^upgrade_path = $/;" k section:options upgrade_path config/odoo.conf /^upgrade_path = $/;" k section:options +valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ valid_date = fields.Char('Valid Date',$/;" v class:MerctransJobs volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer('Project Volume')$/;" v class:MercTransProjects without_demo config-test/odoo.conf /^without_demo = True$/;" k section:options without_demo config/odoo.conf /^without_demo = True$/;" k section:options work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit', selection=work_unit_list)$/;" v class:MercTransProjects -work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'),$/;" v class:MercTransProjects +work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), ('job', 'Job')]$/;" v class:MercTransProjects workers config-test/odoo.conf /^workers = 0$/;" k section:options workers config/odoo.conf /^workers = 0$/;" k section:options write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransInvoices From ec7260b519d6cfa5bb217b624eec74411e27982c Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 29 Jun 2022 09:34:37 +0700 Subject: [PATCH 05/74] sua loi chinh ta --- .../models/merctrans_projects.py | 94 +++++++++++++------ .../views/projects_menus.xml | 6 +- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index f1fe8d2..161ea53 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -1,15 +1,19 @@ # -*- coding: utf-8 -*- -from odoo import api, fields, models from odoo.exceptions import ValidationError +from odoo import api, fields, models + class MercTransServices(models.Model): _name = 'merctrans.services' _rec_name = 'services_names' _description = 'Services offered by MercTrans' - department_list = [('localization', 'Localization'), ('marketing', 'Marketing'), ('developement', 'Development')] - department = fields.Selection(string="Department", selection=department_list) + department_list = [('localization', 'Localization'), + ('marketing', 'Marketing'), + ('developement', 'Development')] + department = fields.Selection(string="Department", + selection=department_list) services_names = fields.Char('Services') @@ -18,29 +22,44 @@ class MercTransProjects(models.Model): _description = 'MercTrans Projects' _rec_name = 'job_name' - language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), ('en-US', 'English (US)'), - ('en-GB', 'English (UK)'), ('fr-FR', 'French'), ('it-IT', 'Italian'), ('es-ES', 'Spanish (Spain)'), - ('es-AR', 'Spanish (Argentina)'), ('es-LA', 'Spanish (Latin America)'), ('th-TH', 'Thai'), - ('tr-TR', 'Turkish'), ('vi-VN', 'Vietnamese'), ('ko-KR', 'Korean'), ('ja-JP', 'Japanese'), - ('ru-RU', 'Russian'), ('de-DE', 'German (Germany)'), ('de-AT', 'German (Austria)'), + language_list = [('zh-CN', 'Chinese (Simplified)'), + ('zh-TW', 'Chinese (Traditional)'), + ('en-US', 'English (US)'), ('en-GB', 'English (UK)'), + ('fr-FR', 'French'), ('it-IT', 'Italian'), + ('es-ES', 'Spanish (Spain)'), + ('es-AR', 'Spanish (Argentina)'), + ('es-LA', 'Spanish (Latin America)'), ('th-TH', 'Thai'), + ('tr-TR', 'Turkish'), ('vi-VN', 'Vietnamese'), + ('ko-KR', 'Korean'), ('ja-JP', 'Japanese'), + ('ru-RU', 'Russian'), ('de-DE', 'German (Germany)'), + ('de-AT', 'German (Austria)'), ('de-CH', 'German (Switzerland)')] - work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), ('job', 'Job')] + work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), + ('job', 'Job')] - project_status_list = [('potential', 'Potential'), ('confirmed', 'Confirmed'), ('in progress', 'In Progress'), - ('in qa', 'In QA'), ('delivered', 'Delivered'), ('canceled', 'Canceled')] + project_status_list = [('potential', 'Potential'), + ('confirmed', 'Confirmed'), + ('in progress', 'In Progress'), ('in qa', 'In QA'), + ('delivered', 'Delivered'), + ('canceled', 'Canceled')] - payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] + payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), + ('paid', 'Paid')] - job_id = fields.Integer('Project ID') - job_name = fields.Char('Project Name', default='Project Name') + project_id = id + project_name = fields.Char('Project Name', default='Project Name') client = fields.Many2many('res.partner', string='Clients', required=True) # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') - job_instruction = fields.Char('Project Instruction') - source_language = fields.Selection(string="Source Languages", selection=language_list, default="Select a language") - target_language = fields.Selection(string="Target Language", selection=language_list, default="Select a language") + project_instruction = fields.Char('Project Instruction') + source_language = fields.Selection(string="Source Languages", + selection=language_list, + default="Select a language") + target_language = fields.Selection(string="Target Language", + selection=language_list, + default="Select a language") discount = fields.Integer('Discount (%)') # add discount field # fixed job @@ -50,14 +69,19 @@ class MercTransProjects(models.Model): currency_id = fields.Many2one('res.currency', string='Currency') sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit') # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') - job_value = fields.Monetary("Job Value", compute="_compute_job_value", currency_field='currency_id', store=True, + job_value = fields.Monetary("Job Value", + compute="_compute_job_value", + currency_field='currency_id', + store=True, readonly=True) project_manager = fields.Many2one('res.users', string='Project Manager') start_date = fields.Date(string='Start Date') due_date = fields.Date(string='Due Date') - project_status = fields.Selection(string='Project Status', selection=project_status_list) - payment_status = fields.Selection(string='Payment Status', selection=payment_status_list) + project_status = fields.Selection(string='Project Status', + selection=project_status_list) + payment_status = fields.Selection(string='Payment Status', + selection=payment_status_list) @api.model def create(self, vals): @@ -72,13 +96,16 @@ def write(self, vals): @api.depends('volume', 'sale_rate_per_work_unit', 'discount') def _compute_job_value(self): for project in self: - project.job_value = (100 - project.discount) / 100 * project.volume * project.sale_rate_per_work_unit + project.job_value = ( + 100 - project.discount + ) / 100 * project.volume * project.sale_rate_per_work_unit @api.constrains('start_date', 'due_date') def date_constrains(self): for project in self: if project.due_date < project.start_date: - raise ValidationError('Due date must be greater than Start date!') + raise ValidationError( + 'Due date must be greater than Start date!') class MercTransInvoices(models.Model): @@ -86,29 +113,38 @@ class MercTransInvoices(models.Model): _rec_name = 'invoice_name' _description = 'MercTrans Invoices for Project Managers' - status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), ('unpaid', 'Unpaid')] + status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), + ('unpaid', 'Unpaid')] invoice_id = fields.Integer('Invoice ID') invoice_name = fields.Char('Invoice name') invoice_date = fields.Date(string='Invoice Date') - invoice_client = fields.Many2one('res.partner', string='Client', required='True') - invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines') + invoice_client = fields.Many2one('res.partner', + string='Client', + required='True') + invoice_details_ids = fields.Many2many('merctrans.projects', + string='Invoice Lines') currency_id = fields.Many2one('res.currency', string='Currency') - invoice_value = fields.Monetary("Invoice Value", compute="_compute_invoice_value", currency_field='currency_id') + invoice_value = fields.Monetary("Invoice Value", + compute="_compute_invoice_value", + currency_field='currency_id') # invoice_details_ids = fields.Many2many('merctrans.invoices.lines', 'job_id', string="Invoice Lines") - invoice_status = fields.Selection(string="Invoice Status", selection=status_list) + invoice_status = fields.Selection(string="Invoice Status", + selection=status_list) @api.depends('invoice_details_ids') def _compute_invoice_value(self): for item in self: - item.invoice_value = sum(x.job_value for x in item.invoice_details_ids) + item.invoice_value = sum(x.job_value + for x in item.invoice_details_ids) @api.constrains('invoice_details_ids') def currency_constrains(self): for job in self: for x in job.invoice_details_ids: if job.currency_id != x.currency_id: - raise ValidationError('Job currency must be the same as invoice currency!') + raise ValidationError( + 'Job currency must be the same as invoice currency!') @api.model def create(self, vals): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 3c5b97f..293e272 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -109,9 +109,9 @@ - - - + + + From 265a6c6e9fa4d7699ee2f6a8c6a09f17e119f272 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 29 Jun 2022 09:39:59 +0700 Subject: [PATCH 06/74] sua loi chinh ta 2 --- local-addons/merctrans_projects/models/merctrans_projects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 161ea53..cd181c5 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -20,7 +20,7 @@ class MercTransServices(models.Model): class MercTransProjects(models.Model): _name = 'merctrans.projects' _description = 'MercTrans Projects' - _rec_name = 'job_name' + _rec_name = 'project_name' language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), From c67b8e242564535e2731bca17a16936a82f07f05 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 29 Jun 2022 10:22:12 +0700 Subject: [PATCH 07/74] facing bug invoice.xml fail --- .../merctrans_projects/models/merctrans_projects.py | 2 +- local-addons/merctrans_projects/views/projects_menus.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index cd181c5..05e2bcd 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -135,7 +135,7 @@ class MercTransInvoices(models.Model): @api.depends('invoice_details_ids') def _compute_invoice_value(self): for item in self: - item.invoice_value = sum(x.job_value + item.invoice_value = sum(x.job_value # x??? rename plz for x in item.invoice_details_ids) @api.constrains('invoice_details_ids') diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 293e272..e8dfd03 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -65,8 +65,8 @@ - - + + @@ -145,8 +145,8 @@ merctrans.projects - - + + From a965973c9695368bc0ea3b92395250e222876d13 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 29 Jun 2022 14:41:41 +0700 Subject: [PATCH 08/74] fix bug xml --- local-addons/merctrans_projects/models/merctrans_jobs.py | 1 + local-addons/merctrans_projects/models/merctrans_projects.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py index be9f815..c8e6d11 100755 --- a/local-addons/merctrans_projects/models/merctrans_jobs.py +++ b/local-addons/merctrans_projects/models/merctrans_jobs.py @@ -64,6 +64,7 @@ class MerctransJobs(models.Model): # get Source default # TODO: Sau khi có currency change street = currency EZ??? + # Get pic address @api.onchange('pic') @api.depends('pic') diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 05e2bcd..9e14db6 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -47,7 +47,7 @@ class MercTransProjects(models.Model): payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] - project_id = id + project_id = fields.Char('Project Id') project_name = fields.Char('Project Name', default='Project Name') client = fields.Many2many('res.partner', string='Clients', required=True) From c5ac678dafa40a4ff4fb4727fa5cc1cf5bb91a35 Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 29 Jun 2022 14:52:25 +0700 Subject: [PATCH 09/74] add tmp --- .gitignore | 1 + docker-compose.yml | 29 +---------------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index c4b3bf8..c064f96 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ odoo/ odoo_pg_pass .idea +docker-compose.yml \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f44f4f4..beedc9f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,38 +26,11 @@ services: - odoo-db-data:/var/lib/postgresql/data/pgdata secrets: - postgresql_password - web_test: - image: odoo:14.0 - depends_on: - - db_test - ports: - - "8079:8069" - volumes: - - odoo-web-data-test:/var/lib/odoo - - ./config-test:/etc/odoo - - ./local-addons:/mnt/extra-addons - environment: - - USER=odoo - - PASSWORD=odoo - db_test: - image: postgres:13 - environment: - - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=odoo - - POSTGRES_USER=odoo - - PGDATA=/var/lib/postgresql/data/pgdata - ports: - - 5435:5432 - volumes: - - odoo-db-data-test:/var/lib/postgresql/data/pgdata - secrets: - - postgresql_password + volumes: odoo-web-data: odoo-db-data: - odoo-web-data-test: - odoo-db-data-test: secrets: postgresql_password: From be6ce8006b29a21a3e9ee7158b1e2dd1e55d5745 Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 29 Jun 2022 15:04:49 +0700 Subject: [PATCH 10/74] add readme --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..83f9fcf --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +txt From aab222dec88c6a5faf1f04355346267512dad4f2 Mon Sep 17 00:00:00 2001 From: Hoang Long <83296144+hglong16@users.noreply.github.com> Date: Wed, 29 Jun 2022 15:30:55 +0700 Subject: [PATCH 11/74] update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @svseas không ignore được docker-compose.yml, để chạy được trên server cần sửa lại cái này --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/README.md b/README.md index 83f9fcf..102c455 100644 --- a/README.md +++ b/README.md @@ -1 +1,65 @@ txt +version: "3.1" +services: + web_prod: + image: odoo:14.0 + depends_on: + - db + ports: + - "8069:8069" + volumes: + - odoo-web-data:/var/lib/odoo + - ./config:/etc/odoo + - ./local-addons:/mnt/extra-addons + environment: + - USER=odoo + - PASSWORD=odoo + secrets: + - postgresql_password + db: + image: postgres:13 + environment: + - POSTGRES_DB=postgres + - POSTGRES_PASSWORD=odoo + - POSTGRES_USER=odoo + - PGDATA=/var/lib/postgresql/data/pgdata + volumes: + - odoo-db-data:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password + web_test: + image: odoo:14.0 + depends_on: + - db_test + ports: + - "8079:8069" + volumes: + - odoo-web-data-test:/var/lib/odoo + - ./config-test:/etc/odoo + - ./local-addons:/mnt/extra-addons + environment: + - USER=odoo + - PASSWORD=odoo + db_test: + image: postgres:13 + environment: + - POSTGRES_DB=postgres + - POSTGRES_PASSWORD=odoo + - POSTGRES_USER=odoo + - PGDATA=/var/lib/postgresql/data/pgdata + ports: + - 5435:5432 + volumes: + - odoo-db-data-test:/var/lib/postgresql/data/pgdata + secrets: + - postgresql_password + +volumes: + odoo-web-data: + odoo-db-data: + odoo-web-data-test: + odoo-db-data-test: + +secrets: + postgresql_password: + file: odoo_pg_pass From fcf2dfdf184fe4bc292376f42aa24fc45e18ee4f Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 30 Jun 2022 15:29:18 +0700 Subject: [PATCH 12/74] fix project instruction --- .../merctrans_projects/models/merctrans_projects.py | 2 +- local-addons/merctrans_projects/views/projects_menus.xml | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 9e14db6..1d94878 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -53,7 +53,7 @@ class MercTransProjects(models.Model): # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') - project_instruction = fields.Char('Project Instruction') + project_instruction = fields.Html('Project Instruction') source_language = fields.Selection(string="Source Languages", selection=language_list, default="Select a language") diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index e8dfd03..e0041a5 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -111,7 +111,7 @@ - + @@ -132,6 +132,11 @@ + + + + + From fc154b6efcf6a4fba9081faec547e4e229c41f34 Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 30 Jun 2022 16:38:26 +0700 Subject: [PATCH 13/74] fix project view and default view --- .../models/merctrans_projects.py | 26 +++++++++---------- .../views/projects_menus.xml | 10 +++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 1d94878..9151e5d 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -48,7 +48,7 @@ class MercTransProjects(models.Model): ('paid', 'Paid')] project_id = fields.Char('Project Id') - project_name = fields.Char('Project Name', default='Project Name') + project_name = fields.Char('Project Name*', default='Project Name', required=True) client = fields.Many2many('res.partner', string='Clients', required=True) # services contain tags @@ -60,28 +60,28 @@ class MercTransProjects(models.Model): target_language = fields.Selection(string="Target Language", selection=language_list, default="Select a language") - discount = fields.Integer('Discount (%)') + discount = fields.Integer(string='Discount (%)', default=0) # add discount field # fixed job - work_unit = fields.Selection(string='Work Unit', selection=work_unit_list) - volume = fields.Integer('Project Volume') - currency_id = fields.Many2one('res.currency', string='Currency') - sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit') + work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True) + volume = fields.Integer(string='Project Volume*', required=True, default=0) + currency_id = fields.Many2one('res.currency', string='Currency*', required=True) + sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', required=True, default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') - job_value = fields.Monetary("Job Value", + job_value = fields.Monetary("Project Value", compute="_compute_job_value", currency_field='currency_id', store=True, - readonly=True) + readonly=True, default=0) - project_manager = fields.Many2one('res.users', string='Project Manager') - start_date = fields.Date(string='Start Date') - due_date = fields.Date(string='Due Date') + project_manager = fields.Many2one('res.users', string='Project Manager*', required=True) + start_date = fields.Date(string='Start Date*', required=True) + due_date = fields.Date(string='Due Date*', required=True) project_status = fields.Selection(string='Project Status', - selection=project_status_list) + selection=project_status_list, required=True, default='Project Status') payment_status = fields.Selection(string='Payment Status', - selection=payment_status_list) + selection=payment_status_list, default='Payment Status') @api.model def create(self, vals): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index e0041a5..b8490bd 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -152,18 +152,18 @@ - + - - + + - + - + From 07d0e9dbd2b1d4a6e433264896067092a9416da2 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 1 Jul 2022 01:23:55 +0700 Subject: [PATCH 14/74] increment number_id --- .../models/merctrans_projects.py | 13 ++- .../views/projects_menus.xml | 105 ++++++++++-------- 2 files changed, 68 insertions(+), 50 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 9151e5d..094f80a 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -47,8 +47,12 @@ class MercTransProjects(models.Model): payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] - project_id = fields.Char('Project Id') - project_name = fields.Char('Project Name*', default='Project Name', required=True) + # number_id = fields.Integer(string="Stt", + # default=lambda self: self.env['ir.sequence']. + # next_by_code('increment_number_id')) + project_id = fields.Char('Project Id', default="Hoc", readonly=True) + number_id = fields.Integer('No number', index=True, readonly=True) + project_name = fields.Char('Project Name', default='Project Name') client = fields.Many2many('res.partner', string='Clients', required=True) # services contain tags @@ -86,12 +90,17 @@ class MercTransProjects(models.Model): @api.model def create(self, vals): print("Project Create Vals ", vals) + vals['number_id'] = self.env['ir.sequence'].next_by_code( + 'increment_number_id') or _('New') return super(MercTransProjects, self).create(vals) + @api.model def write(self, vals): print("Project Write Vals ", vals) return super(MercTransProjects, self).write(vals) + # Auto genarate porject_id with client name, datetime and native id + @api.onchange('volume', 'rate_per_work_unit') @api.depends('volume', 'sale_rate_per_work_unit', 'discount') def _compute_job_value(self): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index b8490bd..7025674 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -97,7 +97,14 @@ - + + + Filed increment + increment_number_id + + 5 + + @@ -111,7 +118,8 @@ - + + @@ -151,6 +159,7 @@ + @@ -171,54 +180,54 @@ - - - Job Form - merctrans.jobs - -
- - - - - - - - - - - + + + Job Form + merctrans.jobs + + - - - - + + + + + + + + + + + + + + + + - -
-
-
- - - - Job Tree - merctrans.jobs - - - - - - - - - - - - - - - - + + +
+ + + + Job Tree + merctrans.jobs + + + + + + + + + + + + + + + + From e8f57064c66df9bb1888e957d9df9dbdabb91e37 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 1 Jul 2022 01:30:02 +0700 Subject: [PATCH 15/74] update gitignore delete tags --- .gitignore | 3 ++- tags | 62 ++++++++++++++++++++++++++++-------------------------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index c064f96..0742215 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ __pycache__/ odoo/ odoo_pg_pass .idea -docker-compose.yml \ No newline at end of file +docker-compose.yml +tags diff --git a/tags b/tags index 46de97d..431ebd0 100644 --- a/tags +++ b/tags @@ -37,7 +37,7 @@ _name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = _name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.services'$/;" v class:MercTransServices _rec_name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _rec_name = "title"$/;" v class:MerctransJobs _rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'invoice_name'$/;" v class:MercTransInvoices -_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'job_name'$/;" v class:MercTransProjects +_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'project_name'$/;" v class:MercTransProjects _rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'services_names'$/;" v class:MercTransServices _start_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _start_date_contrains(self):$/;" m class:MerctransJobs addons_path config-test/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options @@ -53,7 +53,7 @@ csv_internal_sep config/odoo.conf /^csv_internal_sep = ,$/;" k section:options currency_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def currency_constrains(self):$/;" m class:MercTransInvoices currency_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MerctransJobs currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransInvoices -currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransProjects +currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency*', required=True)$/;" v class:MercTransProjects data_dir config-test/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options data_dir config/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options date_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def date_constrains(self):$/;" m class:MercTransProjects @@ -77,11 +77,11 @@ dbfilter config-test/odoo.conf /^dbfilter = $/;" k section:options dbfilter config/odoo.conf /^dbfilter = $/;" k section:options demo config-test/odoo.conf /^demo = {}$/;" k section:options demo config/odoo.conf /^demo = False$/;" k section:options -department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department", selection=department_list)$/;" v class:MercTransServices -department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'), ('marketing', 'Marketing'), ('developem/;" v class:MercTransServices -discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer('Discount (%)')$/;" v class:MercTransProjects +department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department",$/;" v class:MercTransServices +department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'),$/;" v class:MercTransServices +discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer(string='Discount (%)', default=0)$/;" v class:MercTransProjects due_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MerctransJobs -due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MercTransProjects +due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date*', required=True)$/;" v class:MercTransProjects email_from config-test/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options email_from config/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options geoip_database config-test/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options @@ -96,27 +96,25 @@ http_port config-test/odoo.conf /^http_port = 8069$/;" k section:options http_port config/odoo.conf /^http_port = 8069$/;" k section:options import_partial config-test/odoo.conf /^import_partial = $/;" k section:options import_partial config/odoo.conf /^import_partial = $/;" k section:options -invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner', string='Client', required='True')$/;" v class:MercTransInvoices +increment_number_id local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner',$/;" v class:MercTransInvoices invoice_date local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_date = fields.Date(string='Invoice Date')$/;" v class:MercTransInvoices -invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines')$/;" v class:MercTransInvoices +invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects',$/;" v class:MercTransInvoices invoice_id local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_id = fields.Integer('Invoice ID')$/;" v class:MercTransInvoices invoice_name local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_name = fields.Char('Invoice name')$/;" v class:MercTransInvoices -invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status", selection=status_list)$/;" v class:MercTransInvoices -invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value", compute="_compute_invoice_value", currency_/;" v class:MercTransInvoices +invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status",$/;" v class:MercTransInvoices +invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value",$/;" v class:MercTransInvoices invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_id local-addons/merctrans_projects/models/merctrans_projects.py /^ job_id = fields.Integer('Project ID')$/;" v class:MercTransProjects -job_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ job_instruction = fields.Char('Project Instruction')$/;" v class:MercTransProjects job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'),$/;" v class:MercTransProjects limit_memory_hard config-test/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options limit_memory_hard config/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options limit_memory_soft config-test/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options @@ -152,14 +150,15 @@ merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ merctrans_projects_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i +number_id local-addons/merctrans_projects/models/merctrans_projects.py /^ number_id = fields.Integer('No number', index=True, readonly=True)$/;" v class:MercTransProjects options config-test/odoo.conf /^[options]$/;" s options config/odoo.conf /^[options]$/;" s osv_memory_age_limit config-test/odoo.conf /^osv_memory_age_limit = False$/;" k section:options osv_memory_age_limit config/odoo.conf /^osv_memory_age_limit = False$/;" k section:options osv_memory_count_limit config-test/odoo.conf /^osv_memory_count_limit = False$/;" k section:options osv_memory_count_limit config/odoo.conf /^osv_memory_count_limit = False$/;" k section:options -payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status', selection=payment_status_list)$/;" v class:MercTransProjects -payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')]$/;" v class:MercTransProjects +payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status',$/;" v class:MercTransProjects +payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'),$/;" v class:MercTransProjects pg_path config-test/odoo.conf /^pg_path = $/;" k section:options pg_path config/odoo.conf /^pg_path = $/;" k section:options pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic = fields.Many2one('res.users', 'PIC', required=True)$/;" v class:MerctransJobs @@ -169,18 +168,21 @@ pidfile config-test/odoo.conf /^pidfile = $/;" k section:options pidfile config/odoo.conf /^pidfile = $/;" k section:options project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs -project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users', string='Project Manager')$/;" v class:MercTransProjects +project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ project_id = fields.Char('Project Id', default="Hoc", readonly=True)$/;" v class:MercTransProjects +project_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ project_instruction = fields.Html('Project Instruction')$/;" v class:MercTransProjects +project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users', string='Project Manager*', required=True)$/;" v class:MercTransProjects project_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i proxy_mode config-test/odoo.conf /^proxy_mode = False$/;" k section:options proxy_mode config/odoo.conf /^proxy_mode = False$/;" k section:options reportgz config-test/odoo.conf /^reportgz = False$/;" k section:options reportgz config/odoo.conf /^reportgz = False$/;" k section:options -sale_rate_per_work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ sale_rate_per_work_unit = fields.Float('Sale rate per Work Unit')$/;" v class:MercTransProjects +sale_rate_per_work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', required=True, defa/;" v class:MercTransProjects screencasts config-test/odoo.conf /^screencasts = $/;" k section:options screencasts config/odoo.conf /^screencasts = $/;" k section:options screenshots config-test/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options @@ -202,15 +204,15 @@ smtp_ssl config/odoo.conf /^smtp_ssl = False$/;" k section:options smtp_user config-test/odoo.conf /^smtp_user = False$/;" k section:options smtp_user config/odoo.conf /^smtp_user = False$/;" k section:options source_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ source_language = fields.Char('Source Language',$/;" v class:MerctransJobs -source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages", selection=language_list, defau/;" v class:MercTransProjects +source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages",$/;" v class:MercTransProjects start_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MerctransJobs -start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MercTransProjects -status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), ('unpaid', 'Unpaid')]$/;" v class:MercTransInvoices +start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date*', required=True)$/;" v class:MercTransProjects +status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'),$/;" v class:MercTransInvoices sync_status local-addons/merctrans_projects/models/merctrans_projects.py /^ def sync_status(self):$/;" m class:MercTransInvoices syslog config-test/odoo.conf /^syslog = False$/;" k section:options syslog config/odoo.conf /^syslog = False$/;" k section:options target_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ target_language = fields.Char('Target Language',$/;" v class:MerctransJobs -target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language", selection=language_list, defaul/;" v class:MercTransProjects +target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language",$/;" v class:MercTransProjects test_enable config-test/odoo.conf /^test_enable = False$/;" k section:options test_enable config/odoo.conf /^test_enable = False$/;" k section:options test_file config-test/odoo.conf /^test_file = $/;" k section:options @@ -227,11 +229,11 @@ unaccent config/odoo.conf /^unaccent = False$/;" k section:options upgrade_path config-test/odoo.conf /^upgrade_path = $/;" k section:options upgrade_path config/odoo.conf /^upgrade_path = $/;" k section:options valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ valid_date = fields.Char('Valid Date',$/;" v class:MerctransJobs -volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer('Project Volume')$/;" v class:MercTransProjects +volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer(string='Project Volume*', required=True, default=0)$/;" v class:MercTransProjects without_demo config-test/odoo.conf /^without_demo = True$/;" k section:options without_demo config/odoo.conf /^without_demo = True$/;" k section:options -work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit', selection=work_unit_list)$/;" v class:MercTransProjects -work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), ('job', 'Job')]$/;" v class:MercTransProjects +work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True)$/;" v class:MercTransProjects +work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'),$/;" v class:MercTransProjects workers config-test/odoo.conf /^workers = 0$/;" k section:options workers config/odoo.conf /^workers = 0$/;" k section:options write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransInvoices From e5af8c0d13ca4d670a5820fae5cd021d503e7dba Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 1 Jul 2022 03:03:06 +0700 Subject: [PATCH 16/74] project_id with name of client, create date and no number --- .../models/merctrans_projects.py | 68 +++++++++++++++---- .../views/projects_menus.xml | 6 +- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 094f80a..c7fa051 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from datetime import datetime + from odoo.exceptions import ValidationError from odoo import api, fields, models @@ -50,9 +52,18 @@ class MercTransProjects(models.Model): # number_id = fields.Integer(string="Stt", # default=lambda self: self.env['ir.sequence']. # next_by_code('increment_number_id')) - project_id = fields.Char('Project Id', default="Hoc", readonly=True) - number_id = fields.Integer('No number', index=True, readonly=True) - project_name = fields.Char('Project Name', default='Project Name') + # Auto gen number_id + number_id = fields.Integer('No number', + index=True, + readonly=True, + copy=False) + project_id = fields.Char('Project Id', + default="new_project", + readonly=True, + compute="_get_project_id") + current_time = datetime.now().strftime("%Y%m%d-%H%M%s") + project_name = fields.Char('Project Name', + default=f'Project Name { number_id }') client = fields.Many2many('res.partner', string='Clients', required=True) # services contain tags @@ -68,38 +79,65 @@ class MercTransProjects(models.Model): # add discount field # fixed job - work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True) + work_unit = fields.Selection(string='Work Unit*', + selection=work_unit_list, + required=True) volume = fields.Integer(string='Project Volume*', required=True, default=0) - currency_id = fields.Many2one('res.currency', string='Currency*', required=True) - sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', required=True, default=0) + currency_id = fields.Many2one('res.currency', + string='Currency*', + required=True) + sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', + required=True, + default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') job_value = fields.Monetary("Project Value", compute="_compute_job_value", currency_field='currency_id', store=True, - readonly=True, default=0) + readonly=True, + default=0) - project_manager = fields.Many2one('res.users', string='Project Manager*', required=True) + project_manager = fields.Many2one('res.users', + string='Project Manager*', + required=True) start_date = fields.Date(string='Start Date*', required=True) due_date = fields.Date(string='Due Date*', required=True) project_status = fields.Selection(string='Project Status', - selection=project_status_list, required=True, default='Project Status') + selection=project_status_list, + required=True, + default='Project Status') payment_status = fields.Selection(string='Payment Status', - selection=payment_status_list, default='Payment Status') + selection=payment_status_list, + default='Payment Status') @api.model def create(self, vals): print("Project Create Vals ", vals) vals['number_id'] = self.env['ir.sequence'].next_by_code( - 'increment_number_id') or _('New') + 'merctrans.project') or _('New') return super(MercTransProjects, self).create(vals) - @api.model - def write(self, vals): - print("Project Write Vals ", vals) - return super(MercTransProjects, self).write(vals) + # @api.model # đoạn code bên dưới gây bug khi chỉnh sửa project + # def write(self, vals): + # print("Project Write Vals ", vals) + # return super(MercTransProjects, self).write(vals) # Auto genarate porject_id with client name, datetime and native id + @api.onchange('client') + @api.depends('client') + def _get_project_id(self): + create_time = datetime.today().strftime('%Y%m%d') + for project in self: + print(project.client.__dir__()) + if project.client: + + # client is many2many nen can chinh sua lai 1 chut, chi lay ten cua thang dau tien, should be change with project.client + client_name = project.client[0].name if len( + project.client) > 1 else project.client.name + short_name = client_name[:4].upper() + project.project_id = f"{short_name}-{create_time}-{project.number_id}" + else: + project.project_id = "on change" @api.onchange('volume', 'rate_per_work_unit') @api.depends('volume', 'sale_rate_per_work_unit', 'discount') diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 7025674..9b2c9ae 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -100,9 +100,9 @@ Filed increment - increment_number_id + merctrans.project - 5 + 0001 @@ -158,8 +158,8 @@ merctrans.projects - + From 6f0a93a69771670ca4c1946e3eba257edf1fee19 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 1 Jul 2022 07:13:23 +0700 Subject: [PATCH 17/74] start dev job tree, button job, client_ menu --- .../models/merctrans_projects.py | 2 ++ .../views/projects_menus.xml | 18 +++++++++++------- tags | 18 ++++++++++-------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index c7fa051..2088a29 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -109,6 +109,8 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, default='Payment Status') + job_details = fields.Many2many("merctrans.jobs", + string="Jobs in this Project") @api.model def create(self, vals): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 9b2c9ae..2e5b595 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -117,14 +117,14 @@ - - + + @@ -138,6 +138,10 @@ + + + + @@ -161,18 +165,18 @@ - + - - + + - + - + diff --git a/tags b/tags index 431ebd0..bc98891 100644 --- a/tags +++ b/tags @@ -27,6 +27,7 @@ _description local-addons/merctrans_projects/models/merctrans_projects.py /^ _due_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _due_date_contrains(self):$/;" m class:MerctransJobs _get_email_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_email_pic(self):$/;" m class:MerctransJobs _get_id_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_id_pic(self):$/;" m class:MerctransJobs +_get_project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ def _get_project_id(self):$/;" m class:MercTransProjects _get_project_source local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_source(self):$/;" m class:MerctransJobs _get_project_target local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_target(self):$/;" m class:MerctransJobs _get_project_valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_valid_date(self):$/;" m class:MerctransJobs @@ -53,7 +54,8 @@ csv_internal_sep config/odoo.conf /^csv_internal_sep = ,$/;" k section:options currency_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def currency_constrains(self):$/;" m class:MercTransInvoices currency_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MerctransJobs currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransInvoices -currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency*', required=True)$/;" v class:MercTransProjects +currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency',$/;" v class:MercTransProjects +current_time local-addons/merctrans_projects/models/merctrans_projects.py /^ current_time = datetime.now().strftime("%Y%m%d-%H%M%s")$/;" v class:MercTransProjects data_dir config-test/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options data_dir config/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options date_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def date_constrains(self):$/;" m class:MercTransProjects @@ -107,6 +109,7 @@ invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +job_details local-addons/merctrans_projects/models/merctrans_projects.py /^ job_details = fields.Many2many("merctrans.jobs",string="Jobs in this Project")$/;" v class:MercTransProjects job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i -number_id local-addons/merctrans_projects/models/merctrans_projects.py /^ number_id = fields.Integer('No number', index=True, readonly=True)$/;" v class:MercTransProjects +number_id local-addons/merctrans_projects/models/merctrans_projects.py /^ number_id = fields.Integer('No number',$/;" v class:MercTransProjects options config-test/odoo.conf /^[options]$/;" s options config/odoo.conf /^[options]$/;" s osv_memory_age_limit config-test/odoo.conf /^osv_memory_age_limit = False$/;" k section:options @@ -168,11 +171,11 @@ pidfile config-test/odoo.conf /^pidfile = $/;" k section:options pidfile config/odoo.conf /^pidfile = $/;" k section:options project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs -project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ project_id = fields.Char('Project Id', default="Hoc", readonly=True)$/;" v class:MercTransProjects +project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ project_id = fields.Char('Project Id',$/;" v class:MercTransProjects project_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ project_instruction = fields.Html('Project Instruction')$/;" v class:MercTransProjects -project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users', string='Project Manager*', required=True)$/;" v class:MercTransProjects +project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users',$/;" v class:MercTransProjects project_menu local-addons/merctrans_projects/views/projects_menus.xml /^ Date: Fri, 1 Jul 2022 07:47:30 +0700 Subject: [PATCH 18/74] done menu and model merctrans client, need seicurity --- .../merctrans_projects/__manifest__.py | 1 + .../merctrans_projects/models/__init__.py | 3 +- .../models/merctrans_clients.py | 19 +++++++ .../models/merctrans_projects.py | 4 +- .../merctrans_projects/views/clients.xml | 50 +++++++++++++++++++ .../views/projects_menus.xml | 3 +- tags | 16 +++++- 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 local-addons/merctrans_projects/models/merctrans_clients.py create mode 100644 local-addons/merctrans_projects/views/clients.xml diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index 0fc66c4..1f55e60 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -35,6 +35,7 @@ 'security/ir.model.access.csv', # View <> 'views/jobs.xml', + 'views/clients.xml', 'views/projects_menus.xml', 'views/templates.xml', # 'views/sale.xml', diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py index 8c154c4..69c8e65 100755 --- a/local-addons/merctrans_projects/models/__init__.py +++ b/local-addons/merctrans_projects/models/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from . import merctrans_projects # from . import merctrans_sales -from . import merctrans_jobs +from . import merctrans_clients, merctrans_jobs, merctrans_projects diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py new file mode 100644 index 0000000..2195f77 --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -0,0 +1,19 @@ +from odoo.exceptions import ValidationError + +from odoo import api, fields, models + + +class MerctransClient(models.Model): + _name = 'merctrans.clients' + _rec_name = 'name' + _inherit = 'res.partner' + _description = "Merctrans's Partner" + channel_ids = fields.Many2many('res.partner', + 'relation_m2m_table', + 'rel_1', + 'rel_2', + string='Partners') + client_note = fields.Html('Client note') + client_currency = fields.Many2one('res.currency', + string="Currency", + required=True) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 2088a29..8abacab 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -64,7 +64,9 @@ class MercTransProjects(models.Model): current_time = datetime.now().strftime("%Y%m%d-%H%M%s") project_name = fields.Char('Project Name', default=f'Project Name { number_id }') - client = fields.Many2many('res.partner', string='Clients', required=True) + client = fields.Many2many('merctrans.clients', + string='Clients', + required=True) # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml new file mode 100644 index 0000000..3088971 --- /dev/null +++ b/local-addons/merctrans_projects/views/clients.xml @@ -0,0 +1,50 @@ + + + + Merctrans Clients List + merctrans.clients + tree,form + + + + Client Form + merctrans.clients + +
+ + + + + + + + + + + + + + + + + +
+
+
+ + + + Client Tree + merctrans.clients + + + + + + + + + + + +
diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 2e5b595..c168a75 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -25,7 +25,8 @@ - + + diff --git a/tags b/tags index bc98891..f5d2f74 100644 --- a/tags +++ b/tags @@ -16,10 +16,12 @@ Default .idea/workspace.xml /^ $/;" i +client_view_tree local-addons/merctrans_projects/views/clients.xml /^ $/;" i create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransInvoices create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransProjects csv_internal_sep config-test/odoo.conf /^csv_internal_sep = ,$/;" k section:options @@ -109,7 +120,7 @@ invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_details local-addons/merctrans_projects/models/merctrans_projects.py /^ job_details = fields.Many2many("merctrans.jobs",string="Jobs in this Project")$/;" v class:MercTransProjects +job_details local-addons/merctrans_projects/models/merctrans_projects.py /^ job_details = fields.Many2many("merctrans.jobs",$/;" v class:MercTransProjects job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i +merctrans_clients_actions local-addons/merctrans_projects/views/clients.xml /^ $/;" i merctrans_invoices_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i merctrans_jobs_actions local-addons/merctrans_projects/views/jobs.xml /^ $/;" i merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i From ad369105ff5cf62c3c8143d1c60e993193316a47 Mon Sep 17 00:00:00 2001 From: truong tang Date: Fri, 1 Jul 2022 12:13:55 +0700 Subject: [PATCH 19/74] fix projects --- .../models/merctrans_projects.py | 24 +++++++++---------- .../views/projects_menus.xml | 10 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 094f80a..93f74b1 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -94,10 +94,10 @@ def create(self, vals): 'increment_number_id') or _('New') return super(MercTransProjects, self).create(vals) - @api.model - def write(self, vals): - print("Project Write Vals ", vals) - return super(MercTransProjects, self).write(vals) + # @api.model + # def write(self, vals): + # print("Project Write Vals ", vals) + # return super(MercTransProjects, self).write(vals) # Auto genarate porject_id with client name, datetime and native id @@ -155,14 +155,14 @@ def currency_constrains(self): raise ValidationError( 'Job currency must be the same as invoice currency!') - @api.model - def create(self, vals): - print("Invoices Create Vals ", vals) - return super(MercTransInvoices, self).create(vals) - - def write(self, vals): - print("Invoices Write Vals ", vals) - return super(MercTransInvoices, self).write(vals) + # @api.model + # def create(self, vals): + # print("Invoices Create Vals ", vals) + # return super(MercTransInvoices, self).create(vals) + # + # def write(self, vals): + # print("Invoices Write Vals ", vals) + # return super(MercTransInvoices, self).write(vals) @api.onchange('invoice_status') def sync_status(self): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 7025674..5a68f13 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -119,7 +119,7 @@ - + @@ -159,7 +159,7 @@ - + @@ -169,10 +169,10 @@ - - + - + + From 855524c488a3d58775f487c2cfc6bd199ab2d140 Mon Sep 17 00:00:00 2001 From: truong tang Date: Fri, 1 Jul 2022 15:22:40 +0700 Subject: [PATCH 20/74] fix invoices --- .../models/merctrans_clients.py | 17 ++++++++--------- .../models/merctrans_projects.py | 17 +++++++---------- .../merctrans_projects/views/clients.xml | 13 ++++++------- .../merctrans_projects/views/projects_menus.xml | 15 ++++----------- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 2195f77..6cc4bc5 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -6,14 +6,13 @@ class MerctransClient(models.Model): _name = 'merctrans.clients' _rec_name = 'name' - _inherit = 'res.partner' + _inherits = {'res.partner':'partner_id'} _description = "Merctrans's Partner" - channel_ids = fields.Many2many('res.partner', - 'relation_m2m_table', - 'rel_1', - 'rel_2', - string='Partners') + + # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, + # string='Related Partner', help='Partner-related data of the user') + name = fields.Char(related='partner_id.name', inherited=True, readonly=False) + email = fields.Char(related='partner_id.email', inherited=True, readonly=False) client_note = fields.Html('Client note') - client_currency = fields.Many2one('res.currency', - string="Currency", - required=True) + # client_currency = fields.Many2one('res.currency', + # string="Currency",) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 69e5d4a..87ea5ed 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -92,12 +92,11 @@ class MercTransProjects(models.Model): required=True, default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') - job_value = fields.Monetary("Project Value", - compute="_compute_job_value", - currency_field='currency_id', - store=True, - readonly=True, - default=0) + job_value = fields.Float("Project Value", + compute="_compute_job_value", + store=True, + readonly=True, + default=0) project_manager = fields.Many2one('res.users', string='Project Manager*', @@ -173,15 +172,13 @@ class MercTransInvoices(models.Model): invoice_id = fields.Integer('Invoice ID') invoice_name = fields.Char('Invoice name') invoice_date = fields.Date(string='Invoice Date') - invoice_client = fields.Many2one('res.partner', + invoice_client = fields.Many2one('merctrans.clients', string='Client', required='True') invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines') currency_id = fields.Many2one('res.currency', string='Currency') - invoice_value = fields.Monetary("Invoice Value", - compute="_compute_invoice_value", - currency_field='currency_id') + invoice_value = fields.Float("Invoice Value", compute="_compute_invoice_value") # invoice_details_ids = fields.Many2many('merctrans.invoices.lines', 'job_id', string="Invoice Lines") invoice_status = fields.Selection(string="Invoice Status", selection=status_list) diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 3088971..7ab0d20 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -5,7 +5,7 @@ merctrans.clients tree,form - + Client Form merctrans.clients @@ -15,12 +15,11 @@ - + + - - - + @@ -32,7 +31,7 @@
- + Client Tree merctrans.clients @@ -40,7 +39,7 @@ - + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index f17cd1c..b85d19b 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -40,6 +40,7 @@ + @@ -72,6 +73,7 @@ + @@ -120,13 +122,12 @@ - - + @@ -165,11 +166,6 @@ - - - - - @@ -183,10 +179,7 @@ - - - - + From f20e80ad22754e9359edf6ed60ddc1ecefb4a610 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 6 Jul 2022 11:41:11 +0700 Subject: [PATCH 21/74] update gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0742215..174dfdc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ -__pycache__/ +*/__pycache__/ +__pycache__ *.pyc odoo/ -odoo_pg_pass .idea docker-compose.yml tags From 16e2885b96b3e217057a5996e85b10ff1f4e8ff3 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 6 Jul 2022 21:43:13 +0700 Subject: [PATCH 22/74] add venv 2 gitignore --- .gitignore | 2 ++ docker-compose.yml | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 174dfdc..97e3160 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ odoo/ .idea docker-compose.yml tags +venv + diff --git a/docker-compose.yml b/docker-compose.yml index beedc9f..dd229b8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.1" services: web_prod: - image: odoo:14.0 + image: odoo:15.0 depends_on: - db ports: @@ -32,6 +32,4 @@ volumes: odoo-web-data: odoo-db-data: -secrets: - postgresql_password: - file: odoo_pg_pass + \ No newline at end of file From 31649144c69a81d6b8ace4603d1be2e3954d9342 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 7 Jul 2022 01:29:35 +0700 Subject: [PATCH 23/74] Done name and security --- .gitignore | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 225 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 228 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 208 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 211 -> 0 bytes .../__pycache__/controllers.cpython-38.pyc | Bin 175 -> 0 bytes .../__pycache__/controllers.cpython-39.pyc | Bin 178 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 247 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 250 -> 0 bytes .../__pycache__/merctrans_jobs.cpython-38.pyc | Bin 3260 -> 0 bytes .../__pycache__/merctrans_jobs.cpython-39.pyc | Bin 3479 -> 0 bytes .../merctrans_projects.cpython-38.pyc | Bin 6076 -> 0 bytes .../merctrans_projects.cpython-39.pyc | Bin 5975 -> 0 bytes .../merctrans_sales.cpython-38.pyc | Bin 504 -> 0 bytes .../merctrans_sales.cpython-39.pyc | Bin 501 -> 0 bytes .../models/__pycache__/models.cpython-38.pyc | Bin 641 -> 0 bytes .../__pycache__/services.cpython-38.pyc | Bin 716 -> 0 bytes .../models/merctrans_clients.py | 10 +- .../models/merctrans_projects.py | 24 +- .../security/ir.model.access.csv | 1 + odoo | 1 - tags | 254 ------------------ 22 files changed, 28 insertions(+), 266 deletions(-) delete mode 100755 local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc delete mode 100755 local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc delete mode 160000 odoo delete mode 100644 tags diff --git a/.gitignore b/.gitignore index 97e3160..2e72cc6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ docker-compose.yml tags venv + +local-addons/merctrans_projects/__pycache__ +local-addons/merctrans_projects/controllers/__pycache__ +local-addons/merctrans_projects/models/__pycache__ \ No newline at end of file diff --git a/local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/__pycache__/__init__.cpython-38.pyc deleted file mode 100755 index 8867a439b154b4a9d78ac97e3746bcdc14fd93a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmYj~u?@m75Jl|-5CXCR3#15M03jMgM}uh6SSGeYkmHNa4iW<}42v*CS}Inc;@t72 z`}e+dx_`>D86y?1$9Yft9mBs83R@b#B-2cD%UWJ?9yuXS%7i#QvV8R6bdvL7(t{*b2w!}tzUvM0lF#rvLx| diff --git a/local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc b/local-addons/merctrans_projects/__pycache__/__init__.cpython-39.pyc deleted file mode 100755 index eb365fdf85ad9f0158b63de5b470b4148569c6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmYj~JqiLb5QUShim2-e1nVs{AlQl6X(fW#Y!hM<)|LD$Ni4j8ckxQwT6qO4CxzgH zdGifC=J7lqAkcLDIB#LU((x|>#|9=$z$B7bBZEtf6BA%k65#BJiq0EDq`+;@IH`01 z8VYBlcUmhS_C?krpWgWl?1_9gak9^jo&rSZrP9t;^x)l9i5Tc&$xNi$39e^cN@oK# g%8Tf^4XpX47^`g^8Jjovw!eb%n^x;o6q1eb7aXlOlK=n! diff --git a/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/controllers/__pycache__/__init__.cpython-38.pyc deleted file mode 100755 index c0cb0b83b3e7c275ccc4ac6baec0f9f4d6c1ab8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmYjKK?=e!5Zttaq7?i_4>jmn#1{x6Uc7|Zgjz|mB}oOJg`kf~giwNk%~WF^Gc(44TX@8G*u@ zjJLRx^YcoI@^f-hi;Dd;nQk!@fi$jUC}IIpVB%MZerPdJRzD*>CqFM;KcFZ-D>b>K zSl`GrKDR_aCqFqcM>jDgB|ooNKR2}~xuhsDuQg`kf}Mu!Ny*F%439w^WWWgIH~?`m3y?@*2xib^^jpbL1QJFNze4mg@^e%5 zONvVK^U_Na^V0S6Q}Xk5Q&P+HbMliDb956^Qu6bP^>b5;l1qvb^NQmOit@8klS_*A jlk@XRit=-EQj1X7dIgoYIBatBQ%ZAE?LfAD24V&Pgg7oq diff --git a/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc b/local-addons/merctrans_projects/controllers/__pycache__/controllers.cpython-39.pyc deleted file mode 100755 index b138771191ff4a3f7c80f1ba5886d7a4cac6cb2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmYe~<>g`kf~giwNy*F%439w^WWWgIH~?`m3y?@*2xib^^jpbL1QJFNzryuHi&Kk= z^)u3Q^7GR51B&vqQj<%H^^Hv9b4&Dd@{<#DbQ4oj^7D%Ib5o0wONtWnisK7ls*>~b gN{aGxazG{^vGocnZ*kb<=BJeAq}qWj{0zhl04|{~SO5S3 diff --git a/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-38.pyc deleted file mode 100755 index 4cd6eba9ce2f7ec66d062466d0f297f605332ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYjKF$w}P5KM9kB5Gmn2d+3%*@^f75kzdR33r!po+MdGqGIi9{L-~ne!}n_UAcy;&{-iR jSkJq}Uk^7RmG)eS#x_BS`T5=smS|qITE!k88%OL57I{Ey diff --git a/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/__init__.cpython-39.pyc deleted file mode 100755 index 86d031658163f845741536f4f26118ce2c7732be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmYe~<>g`k0(ri+q;eqr7{oyaOhAqU5Esh;i4=wu#vF!R#wbQc5St0eW{P40vYCS! zG+ACU0+nbo-V(}9ElMsaO3W*cFDS~-N=+^)28!|_M6>dfiv2X1Z!r{sOfO;v5-S;s zSV3$M@ylO7v^ce>SU)2@CqFM;KLBcozL9BsZi#+QesW@tZemJGeqOOY!cdr1`nmZj ksX4{^@$s2?nI-Y@dIgoYIBbA|r8%i~AghW&mhvzG0Cb!{#{d8T diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-38.pyc deleted file mode 100755 index 56435a41c5787345f446d70c8009aeacf039652d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3260 zcmb_fUvCpf5Z}E&_StdlKoSUnz=i(?5(7zTODj~GpbA>jv$ z<@X^%{=mup$AHNfFp@h!7-2Ld4eHQ_=4cJw(J9Kb&}f*BNy%4)>CAXZn8Ee++_vuI znYl!&xj(^{RCTF)%|PZ>10J$O<{B~MVN#{C^3)3h=A}U#JrE)mJ}%$?5j<^X0ja1Gm91KIVZ>S>lQ1*-@uOM6kt|lB{s;)tg@p!14=st zvobrzj_(*wNlAv4WJE~@m1LBi0NF_xV>_l(Rq{t@NS#}P-GX%3^ z%m$u1#}z-R_+ho`Ji7pP7vcLOFdt=?c#d5Ls}ua>>oIoa4Tbk9e6y>p`jTwZZR(64 z(p_WMJG#?KccWtmZ#KoIJGwK6bTxLfqnl9Q$?VRuTkOUgjooH59qqY3?X1#%#O`#o zHfYgi7HmFdpPHc@5;f)T==Q*qU2G$lC;Z>?sR$`=R+v9S2pcM5wCMUO{AFy zX~?UZEHvYkM`_@Nvar}?QSQglY9Jb%$--Qht!nLoAhMext_z+d?SY38ZmA}qGeNiE zwM~$IcOUnF5(}PlfqTq%S&&=47x_E{u{GD>+68dYURF*~nP+^}YlUfh06sI_^h6qQ z;pmGG=a!*jEx|Wh0q&Z=&lox)D{h^qZjuTPuV&ywxtmEE3yzCD7DwTx%=>Yp*-E)I zA2hrmlx1bZkw=quWhrh6pWEMfQN88Wxy(O^>S2(q$zin;qDJi8L@lct0!}OuBS=ml z83od=EPDc6>22Z^p9VaQyasyNzfY=GR`qNjv{w7HOBl1?5`stmCLq+|An+Un7)14U zaS3cwd)`ZV+nR6jj61%U^p2~ElZWh}(^XAO;0KPOkHtsderYc)-(P;R)RD_V0_pIv z2S^>T@ZqHQ9^^F`b1;(gK(@$h@`g~7(k-&Ct?S#Af(*GW;u?%BkzKk_HD!@UNlS1y zjsWu}c%F)LV6MV|JjuM5Wp9^C1HQkyOT-n>|Mh)sEpG5yDq3+=Pazw%n8ooF&5GK>~ZJ!3qf4aFThGFB+U?e#pM7L;(wkP@y&Gdm1>carz*I_6O zZUEE8V2jL?AID!%z=HO$P}~-Ejg1nbA#5EA?a3qD>iUxH*XK_kz!<0kw)_HNMZc&^H&kh5V0Jyr z&d{D`*TM3jXQx572qVGU6k+?IZ`qErnBWm};a=p2{KS1!9_|67{G5dXAmC|M1aw=2 z1JRp3Bf>~^*3tb+e$%$;FP&(r+CqCaJI(khyU|KgdxhK3QDG|Vbj?%k7SFJ)T(WW9 zT^rhus-&CXg36LGkvk%OISPHT8;c8F9j=KWN`8RlNeKudGDOQ%qosH43kR}xl%=#- zi~m2!7#~Jv<_Kg$Xr%uInA->kmhbz48FssY?7^}E7KdRuSj>m*4i!nSTVR@0k&I=< zjD_(G1Bc&G{e@7)R{s7n*aKq{E)A7<736ypKZIeyl>zC_Dmld9)GtmATZcxqckQzW zGJe2hp?Y3gu8S9#>&l|*LWgaI$d_DqqveGijj5J^knzM9K~r5N1y^uCQw;ace(I&I z#D#k`6^M~E=GHtR@JFV!9(&Q|ZMZH}gA^A*CaxiwMpDBi1Ko=e8k#ib@sR8xp}JLJ zse6?LKb@JPxB8d3DEVU^*Ce6I47sG}jx$M~;+vfLM$ W3KYYW*5_Hy@8O-Hn&=2E>Hh)@B1pdg diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_jobs.cpython-39.pyc deleted file mode 100755 index 007086be91d1d3a26946639813a39998dc535f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3479 zcmcH+U2hXdaQD7^b{r=VK0^3%fC8qF@C~ghRGOeFs8Ff|DxF%Lj@ylM=6vVuo-1O7 z7lPC$enC|U`o>>q|H;1gsehqrOK0}ZPMieVht|=~&Ccx1&Ccf~7#*z;`2F(a`^U~+ zLVm@~)}IBNPhrXH02pC3CT;3bintLQZPPQ`mS?qX&!*&a!c1npAk5-+%h@o!60;Xc z!}$$lNrS4fM?oC1AdAxEju5G6n92+~k#d$J9y6(&cFK4xLp;9qSAxx_u;kB_5KcVG zh-WbBnauDkW_orLUilOC9A0X<%!WVbrQwxfS79aQvNEf@G`$hc9f4h$RoUoE%d2Wi zO;g4+WmHqfHD!;c)HG!;n*iEASo>ev-k7ExUl4sz3A(SFz;U?;f4PJ+}yKKbepJN25va|)mA19tia*`OQLJG_H; zhMg^VM|SWU>|DV+s(Bw4I^oIAvkL|9*bd$dn=N?9fj7l+xjMTDn87Zw%LR9OhdJvB1=b7Kj)gR`#8C5XGvdX&iAR_r?~}t_XSkiy&!sgCy4j|YMpf|P@2(WFS#H&1tc$NfhG<#T2rcXA^Tn|cXJ-sTrAnXdk zlW+|jR$$->2W}iC&0b{@WV8Bwknx^7-{m>BcQXqLQ>9meV4=|sLmbB!>_HnVcfb6s zzPNOI>EU8QS7iy&39+Ln6MPXugBbh}H(<@dk|zMHlUL+5p(La0q-C_s4d`PzwoZJD zkwx-`-f!5d!V}pQ+)op(><(C-iD?km*MPvOQjmx94OJGrfB6j&4dDO&aP}c4!0bvh zPLt+raRoVh`I_I(X5%yr;tL>}CUSOgWxs#r*}VB};b2M3bk@WK=)Mh0Isl02(kks8 z9V(=mZD}>+26TZ5OS|C|AnRnFd^`1wW@MeVXv@%U(AYZl%~kCPf&PM2!Sng$ZJlsX zg;D5h^o=3T0#}ua8)zTo;2cU#0a$>w)$Aj?m_113|HEn{V#-02BPK4ORT!u(Moz-^ z!8Rig?P6q6ftBK}pl-<8p;W7ZK1eIlf;97CRxOg;n})aq95t5Lp&u9JD$W3PyIn_s z_BAYt(IaMWdKa7ew&ePT>=}wV-ciTA_KZTr(Jt!Kt#R&KmRI(sWxILoC}{fzmc&m3 z%*OZHmTOcMiG}aO?B_e|L_In;Zvmq1yxPxAu-0hN4Fk#)@-yE(A;QW`R_uNtKSKUK zFK*K??)R?dJqBM@Z+B%@f6VL9_F*gP*-D^i0(O?VHmQ#1KCbsO{VJHCqa@ISyJd{p z5AC~u7av9sOtUD_-z>5UGU$^l@pAg}*}$G`P~&ay*tUpo6S?0wrCi^~vFiJ(;``9_ zyD{Qb-(T$palx_m5g;-yLlJfKfGhighdEjVgupLm<=zXD zwaYNXbORTsfhH~@IFH~mf-3;jNPlKSS5wwJR?4P3bjvC)_NS~@fvJQQ0B;o-6y>H# z2xWzz9gKH)!lWKpy8R1mJpy}~z_y_(19wPq4XHN}+(fY1mo=s*2+liP@;LyPTKdm* zYfxYgx|RkOQ?z}Rq-u{$QF6MSd7u5h4^V8ou|FEBYCvTyu4%xdzi+lNqkXOt-)+Qf1Y2i@daMvl1^d z`#Zxe^U_X*m7nVF0INWef#m3IE?P^%3*;gf5B(OG&xbn@MI@S(eOXe=xMtvWxQtI{ zqn&VNg$vG{`-g3ti8$9xZRkwUQV`&!S4|zN6@(vFo zcVIScQ6s6$@~$T$;-48wQAPr@ld|M(-XcdOcBayNy_(ofrD(I6RGLlrwb$n0tIg(v zp4TQ5&?=}QNx3O_D`l%q#$`+RU0To`V)+}JZ67Z*;q0Wmn7^^IJ0P)U);u9>jCiJr zG5jd<{O;6R*x^%==!L;*%$!mVYIux=ft<=+-t3BS9Tq{PqT!I9$?m2o z;tll3;~=(f(bq6^eE(&cMcsH&G}M>_ku!|(^pStn|5M~p*s?OKumM(OgRI7e*b#P= z4YLt8%8soLyG3@Kjj?fdV%2g>>?AwIUSX%%tL(MaqH8mUondDYePv$R8DOs?-m1K^ zKFH4DdmeFELu-h=!QNyOtp1(p9#QSL*xT$K^d7~mLDs;mVaP|=B%*hUy^C?9s{LNx zKBm@xA0v;eo)375eTWstl>8&e$00w#e#SmlE1!h?6#E47S0F#lK4qV=&!NKvyYOAX zeN~P9f?ZT&Uqj1bKL@Y7XB2-)@n^x0uxW0qH@&V}mw8#W&hhi>Z#>afbT-3gAKTly z`=)ALVOJm9?gT%-Q)k!M^`{27x4_M@8&6Gklihl(ZR;5QHstTH+id=+!G6IONa{A8 zXqM(q;>L!({Ji%|a(0&QGF~jZ5tH@V<)jx)B%RwZ_bRJUX-H2V8PzV$tt( z+dlFTtM|K??#0LQZsZ5%)0yzvs-Fjq<;A#mC0NC|SaTd_VtFy^xOO?NW*rmDHbgnHHDVu<2?DTbVRh)Sh}8AOKYA_FN#EC=}uBw>WK}!h$IjF#@%_h za@XgPN^YEl8)4(-ouqg(6g*XM-D})fNbDOPG=$G+jOaD)EGMNqJt_NEFy5HG5+Aw7 zMaK)AiS&0pCd4y51^JtOZcCOl)yt-U#nghV6zCxyft0<%NtTc`FQ7e9_@7DbHjqj2VE}5I?Je zOBoN$1r#`{L58C5ffpAb{c;-bDWgpJ4=L-r<=Kpd+-`Y63)zt+_Dr99hE&}Pu$Rm& zE~{TiY(IDyqSP?gp6hdv!WJKPE`Y|Be%Ly5vvD=!=aIHi97~L^c)fP?d;q#mQcVcB za7#07ANIWW9Q73TtMLQj>C_{bt$+TzYFBwBiRK@z9coaE$UHoh}znzDiui?m9pRJ)R6VTVbc$i+Gbx z_CqBb$kuB5tZpTx{)nWO%N5p03Nk`qlaD-4CPjKE@-iOEbiC~a@PmjeixHgc z%tD*kp6&6J%S}OV)RQpH+oa;`r0tdgd$SMmR6OaCCqW`$t1W%o(6va9j4f^3*fF>C zr#h0HfxMJyFa!PI0@y1Zm{aJY=0{Mz2d9V=SSKmA)DQ|EAc2*{f*<5F9Ywv_YI{;P zn`to~$6#?8WEqbn_@o&XJs!^!W&f4f4YlA;Q9lo_d&1wd$Do#<69mG;sPTQG;mHd|)w6ZQAz?GwPPOi61dXrGi}2LmN5)VJ@L7N4mc$IE0Q9$3FM5}W<9RB zA2;$WUZjj1f22$#<2E#5MS#-V`fv5zxVTPXPs=(TOX@N z@gi4&<3v0Ke=3_g?YkeafaZpA3+HzZZgZDwk^L)bs0(_Em!$t~x4tH?@h z^|lac|8shI;c7edqBP#@+Yn=sO>tYjAhQsvQ7%iYS=u$VIkZh~EgO)!AgOitSuf~N zBn1VKitQ{FsZdZSUd25n1KKh9 zCy;$eUPBnrL*IanpL$bBrjHUm9kn;aNmc*n?CX%Aph+ax`SINaCdqGwZRSG zW?H2?2JrPD_*!&Ms_?gZoLJTNujjlV^RUwlFxpYH2OLB;VrtNJN2 zOM!(tXmvwepm|@=yjr#(avySsf;Y)XHi_X3`fZ6MArGWqD!!`5oCBlM@5x6x0Rm<` zR`q38-GxwHjD7+(=MOAG=Tg!`d1Oobx|(M2yPB>&FjPs>=j*yk0(B!XCf`l;Z(mNr z)9YF~_8O+?Fz!}^( zOHvDEzw?qVf}`hmcqILUprHsL6TFBg{#Q-*`NzZxxsxfPl#|b;9zsbUe`HXl+cHq? zOi|0LU2V7Cy?+BRGsBE|&5PE!BN2U$C!M}&`5-EMWVDJDRrnwvd&L_>)`+}R1V^$L z>?wqQz&J_pntVXn2l?qmeEy&x4w?H?Fx#1g z7`DvT{y$*L(QGZ}$H1jhld9CAYEs9ab2Z`NJ|-Na8=P27XX%^jH{BSBY?J!j>Y)Z8FKxlAZ~$-jcouu2S~NnD4> zuZU2rr7roJxRA(ii0nG&Dm4|ppm?A)CC$q4MTQdSgk{Jet^T#FZKXH>r?7yhl;Qzf z7qs4dy^>h;N2bC@sbeVPBts;egv diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_projects.cpython-39.pyc deleted file mode 100755 index 650bd8757f3be4debd83c539fffb366ec4d69571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5975 zcmb_g-E$Pj5#O)d+dG|3APFSC>;;3Zvwf0{?R-=S0ZV{|LBU9Zcpc}m+>E4^?)Hw^ zJ#1}>s#KutN>%)pmpr5j^2VQ(eN3MGFHosCzwW(V2_(Bx<(z7JXL@>Ox_f%Me=C1< zw5s9vYW=Hw|2Uy(|Dw*`pM}mPJdp?X^I5M3mayo{*iW zp{HYa{7xYJIOv5}l84JVWT7DGbjNrdL{rT7TC)Tb4H+QIfW> zzcIXuEI+A=@>AU#5f0R-q=#=x)m~A47%fZnAZW|z`FIzsm{_yXkeAl;Rx9+oGD=S6 z(r#~UO)4qed)scYRKsi-Uaiw>!-#~9@M<^q^e|fK`f5wYLAdT!ZstvzCFBFy>Gfq- zhOsxYkoCAzU66fW#ngUgq;?c5%uXwj?8r7bDs^(DmKwFxX|bxUR$6Vf;MYM%qFrmX z?hpJ98G&AjMbb)3$#&MPwSKj=RkHVB^*!l#V4jkkk$8Sjd$K0)Xp zfNHY3IVup%qKd$(qcUJ~hyK6RlY>_tX^ch<6`rk90`C1^(OOym;@aA>J1s5Z7yd zty!8ki|hB3J=ZS}jJ?+{4})a9xLR&5mpYrhdmOZl@rIF+b0 z<5CBqpO4_cCrr(9R^{jpoWnskO4<2eeVFnk%={^2$JMVI$%^2%2}6 zyy~4m#+7Z?mEpy1cSGba_B2Dbo-`^B*OX`K;wHf;f??nPnGT=JO^D z8iD5!Me9mNQ8Ka^QuuI(jK$b}KPiFx$z|+RLG1}1P%`%_3waZKr|pMrq&$&2^TSrd zd}es|AjF9Z&tB#CGe`#EgC1&#@SMeA3tZR}z}8!!Np%>$?&3mH%iBxH#;AE^A=mst zCw@KxZD%Rfhf;av`Az_fqm^fdqS~E0O5Ps?&{9z{Q#FuhIu9ii`HG7nj$*)7Avv@R zx3;Bw!w=U7@M)AB&JwumyEqW$HB4SWjnIm7Aj#N@kD!c;SxIdnh}ykD7`rp)8c78w zx8<&eL98kyUe9;F)9Vbn@_CI+Xb%)!k8SvE*g{nM9qB4RmTq4vw^${q;DlWi{eeu! zTkT%AKZs?EZukS{jpS>!0@1M2@=zkJ7kq{gX(@^k-sB@6C8e{SR7jBlRiI=n*YTzw z!VfB`F2``Py8vwxXJH_-R$&T8<3R+|{B5eaZq{!bus8ovn`$CG(Q%L%kZDJMWawI~ z$HtEK$arGz=udSdI|JD%*I*v{!3D54a$!!Xk5V2(`2n1wrm#+Gw^@Y32L*mDwcv;7 znT}fBYIpo7YPGT&dlbUzBFHM9h)|JcRP|)KNSMPdaT>hfk5Rt}ue&PP)m~k|p6ZuG zSo6{sG^&0@j1P%07GOOW&?R7*>8V4{sr`EL^wfU9f#i)-thC^k7Ba?GYk-JLry>MV z>wp1A3}dv7>R$ZvLz<_Z-vrsw7PQaZhdLeArZ$ZuJE5VaPZBkVw#@sM(D=~46`0Ym z)HS@+6(Uzb(n=AVxR;lRQ|@P=Wf%J>Hu@(R{2d-fDVpgRj&A(NFf4wOv-=%zK=@Z9 ziqsYWF=AT`B)7ib$TQfEjhueSCX#VmnzCXb8 zyn%F|T@V^SjTCVc%c>hhN<^*`DS#dun~sqz450jjY8S0RCgM*Hm|fEiK(plZev@CC z)tFPGw0ND!7!g8vYMjVn5N|Y3TntOSdJ!90e`0tPEw~L=IA><}crP;pwB^MxmPiPx zO@|r?HAx#C14)6+!|n5^eA~E@oQS;|k_mq(Kr-^ic*<_NRTHG&Sj0KEm8 zfy@PIz5jysiY`T3VtCEzL($z#ogUB(YJ#L<)R&=%6oqeE-91sYM2yj48bV#{2<4SRf%s`bxu8PZ1lp9!jyi|KS6%@Bk>775`m(#4@4WS5qvn-=-U-&c@*tB zA$>ylK<#7bA0niWQ9}1LN?4zI_#XVqqVD48S4~&l$PKz@v?=qe~jcoPW9y~n+ zAW^dCb9M+%qO>+_F@8?oC@!R%&vMs#Du>!GqLN}PLJFYtsoo~i07YbNL&D-_`px@WBfM88|pvWXB*wSQ$Xz3)3(Z z{Wn1UoaWW@1(Cy$0~n^H6Zs^8yA*UHy2AU?C>2qz6=%`lGQJ)_YE#B`cgyZ%M6HV%)XQAU%s47D;MxtAiwOZ zi+`e(NH2>L=r4-%8rm4m9_*Fb3;cZ@U7RgeqJOzWgRZ)V#nRE-9SpMIzDvZlP`7sm$e1#{X4}1;D95?#AWafX>(=?}fQvcyD{5D~A>9bk=lYR5G_4S#0!Bu2q;LTP;}S9Gn3W*%QZbvzH`r6q{tUUO z20}id?87DP+7`C9Jx zfkakw;rrC2fxi}N!ozzYV!rfj1`+GQFau;I?u8Je>qpt2@9`xxcC<}GeeWa4v`rwt zEkm8z(VrLskSG8^*GWPbCiwP{Z)W`aHeXk3Nj0&Kx=Z9OkUX9?iNW?91c*kW?XW$B z9Djpk28K}oxW?(psr`|&XGY`9fk22b5ThY)WDmk&Fr$8rv9y}ICI>SFK-C=@DpEgT zF0~AnS2!|5IO-D;-n}cU)Lkb+g=!(`_YE)CJCwe``IGIx{ z@Y6A3&dM*_lK;CIaS}*NH|c-Q{NF+b5xmA8MOkH1G<7ay|3`3e0bXP(Kn^67o0YH&Vn45-?b$n6^o$t<`#4xk99KzIa{ zGZn8B)PJKq-Rk6?(tpAxzRC=Xs)mhxf#}_MU`50#i*y(-{I}CIWzl&mJ8dY?5WAw6< zdRZ7SW&-N5s7)#Bi3Bj(6^*iGXQg(cwPvl#E|mJO*kf>zo3>9j3G(>w4k4p))K}(t l>SI*55st?dEjIY%8kPE<-DcZpgnV|keeXF9nZwIR><>Dsfs+6L diff --git a/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc b/local-addons/merctrans_projects/models/__pycache__/merctrans_sales.cpython-39.pyc deleted file mode 100755 index e5b828cdf4ccccb656f60b5e27db1ffb13ec6217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcmYjNu};G<5VhkZl&Y0FFfy=)p_$kasss`fP^n_^Vws$2Q#o<4(*Z_cW#j`G`6aJR z`~nlc1k|2%=X-wVcjuGi@sI?2KY70U2%8)5?I-u0U?rSOBx&?l1&JI0eEZpq#0A zouK|3LR&3EH@HhhaeDsJpq&QXd;I#zxp1 e=d)PglPlb4SF;_f&&J3PPW#WE(SRI2K48CvCx8h6 diff --git a/local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/models.cpython-38.pyc deleted file mode 100755 index 36e5cf8d1c0cdb970fa76cfc7dd826e3c433c924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmZWny>8nu5GF-QmX)8uZKp0?RUj77sY6i|$WSDJjRH*Ztyl*O$7-+L@hJ8zUMs_C> zKr356eUExSqx)?!+?Xs>jmyU0QP7m8NkNb4=wDU2Ph)8lJ`5SpZsGuawv3}5bN(M| TZ#|3g;_d!T-bJ2`>N)!hZV;}j diff --git a/local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc b/local-addons/merctrans_projects/models/__pycache__/services.cpython-38.pyc deleted file mode 100755 index 14b1a6a1fe7893894597e50df740a06993f834db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmYjPJ8#rL5Z+xsVmlWe5iQcSMoQdKA%v7jG`Ub5G}~Ak&)mg_?KQi;NVyhT8u$ZH zA^y^~RQv@hW_{doD|t2Z&EuQ>Jnv3UGDhd?kIBs!&e$*S9G;MzSM=FubO8h2u$D{S z3Mtw^2AsWSARzd}AV9tfKL#>_aL)4RH|4WDaB-^v8|&gljSW~AsJ^az?C|Vao)d~p za$r&bmjMVFLI5E|OX`gA>Ih_OJq~rZl<90| z`YOOXY;=z;c7r^=+}q47q`l|WT(ncW*$@a zc>TF5Zgq>rVAi@@4ys!g8niy62Nt6=X9_@fw%ChX_C~MhEd-4}yV$io@9#}Sef=cX zFIvJw9*T@V;3IyW$1e2EjqvO~&G=n#(abj*bN&yuwN8CJd9hXICG9M;zW9mw3#8`D A^Z)<= diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 6cc4bc5..f4170b8 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -6,13 +6,17 @@ class MerctransClient(models.Model): _name = 'merctrans.clients' _rec_name = 'name' - _inherits = {'res.partner':'partner_id'} + _inherits = {'res.partner': 'partner_id'} _description = "Merctrans's Partner" # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - name = fields.Char(related='partner_id.name', inherited=True, readonly=False) - email = fields.Char(related='partner_id.email', inherited=True, readonly=False) + name = fields.Char(related='partner_id.name', + inherited=True, + readonly=False) + email = fields.Char(related='partner_id.email', + inherited=True, + readonly=False) client_note = fields.Html('Client note') # client_currency = fields.Many2one('res.currency', # string="Currency",) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 87ea5ed..b598c42 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -62,12 +62,16 @@ class MercTransProjects(models.Model): readonly=True, compute="_get_project_id") current_time = datetime.now().strftime("%Y%m%d-%H%M%s") - project_name = fields.Char('Project Name', - default=f'Project Name { number_id }') + + project_name = fields.Char( + 'Project Name', + default=lambda self: + f"Project No {self.env['merctrans.projects'].search_count([])}") client = fields.Many2many('merctrans.clients', string='Clients', required=True) + # compute project_id by client many 2 one -> should default value client_name # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') project_instruction = fields.Html('Project Instruction') @@ -113,6 +117,13 @@ class MercTransProjects(models.Model): job_details = fields.Many2many("merctrans.jobs", string="Jobs in this Project") + # def _get_client_name(self): self.client_name = 'default bug' + # for record in self: + # if record.client: + # record.client_name = record.client.name + # else: + # record.client_name = 'default bug' + @api.model def create(self, vals): print("Project Create Vals ", vals) @@ -120,7 +131,6 @@ def create(self, vals): 'merctrans.project') or _('New') return super(MercTransProjects, self).create(vals) - # @api.model # @api.model # đoạn code bên dưới gây bug khi chỉnh sửa project # def write(self, vals): @@ -134,12 +144,9 @@ def create(self, vals): def _get_project_id(self): create_time = datetime.today().strftime('%Y%m%d') for project in self: - print(project.client.__dir__()) if project.client: - # client is many2many nen can chinh sua lai 1 chut, chi lay ten cua thang dau tien, should be change with project.client - client_name = project.client[0].name if len( - project.client) > 1 else project.client.name + client_name = project.client.name short_name = client_name[:4].upper() project.project_id = f"{short_name}-{create_time}-{project.number_id}" else: @@ -178,7 +185,8 @@ class MercTransInvoices(models.Model): invoice_details_ids = fields.Many2many('merctrans.projects', string='Invoice Lines') currency_id = fields.Many2one('res.currency', string='Currency') - invoice_value = fields.Float("Invoice Value", compute="_compute_invoice_value") + invoice_value = fields.Float("Invoice Value", + compute="_compute_invoice_value") # invoice_details_ids = fields.Many2many('merctrans.invoices.lines', 'job_id', string="Invoice Lines") invoice_status = fields.Selection(string="Invoice Status", selection=status_list) diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv index 0e66b87..8734511 100755 --- a/local-addons/merctrans_projects/security/ir.model.access.csv +++ b/local-addons/merctrans_projects/security/ir.model.access.csv @@ -3,4 +3,5 @@ acl_project,merctransproject.project_default,model_merctrans_projects,group_merc acl_pm_services,merctransproject.service_default,model_merctrans_services,group_merctrans_pm,1,1,1,1 acl_pm_invoices,merctransproject.invoices_default,model_merctrans_invoices,group_merctrans_pm,1,1,1,1 acl_pm_jobs,merctransproject.jobs_default,model_merctrans_jobs,group_merctrans_pm,1,1,1,1 +acl_pm_clients,merctransproject.clients_default,model_merctrans_clients,group_merctrans_pm,1,1,1,1 acl_contributor_jobs,merctransproject.jobs_default,model_merctrans_jobs,group_merctrans_contributor,1,0,0,0 diff --git a/odoo b/odoo deleted file mode 160000 index 2e10f33..0000000 --- a/odoo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2e10f33511ced41f296e0f65d2d042f4e041cacb diff --git a/tags b/tags deleted file mode 100644 index f5d2f74..0000000 --- a/tags +++ /dev/null @@ -1,254 +0,0 @@ -!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ -!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/ -!_TAG_OUTPUT_FILESEP slash /slash or backslash/ -!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ -!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/ -!_TAG_PROC_CWD /Users/hglong/Projects/25_mt/ // -!_TAG_PROGRAM_AUTHOR Universal Ctags Team // -!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ -!_TAG_PROGRAM_URL https://ctags.io/ /official site/ -!_TAG_PROGRAM_VERSION 5.9.0 /b4f0dfbd/ -2BCVbB9y7f8wisPqUL52mPxrYD9 .idea/workspace.xml /^ $/;" i -48aa5e45-b265-4e4f-b5e6-7676a3d0cd8b .idea/workspace.xml /^ $/;" i -48aa5e45-b265-4e4f-b5e6-7676a3d0cd8b .idea/workspace.xml /^ $/;" i -Default .idea/workspace.xml /^ $/;" i -MercTransInvoices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransInvoices(models.Model):$/;" c -MercTransProjects local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransProjects(models.Model):$/;" c -MercTransServices local-addons/merctrans_projects/models/merctrans_projects.py /^class MercTransServices(models.Model):$/;" c -MerctransClient local-addons/merctrans_projects/models/merctrans_clients.py /^class MerctransClient(models.Model):$/;" c -MerctransJobs local-addons/merctrans_projects/models/merctrans_jobs.py /^class MerctransJobs(models.Model):$/;" c -_compute_invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ def _compute_invoice_value(self):$/;" m class:MercTransInvoices -_compute_job_value local-addons/merctrans_projects/models/merctrans_projects.py /^ def _compute_job_value(self):$/;" m class:MercTransProjects -_constraint_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _constraint_date(self):$/;" m class:MerctransJobs -_description local-addons/merctrans_projects/models/merctrans_clients.py /^ _description = "Merctrans's Partner"$/;" v class:MerctransClient -_description local-addons/merctrans_projects/models/merctrans_jobs.py /^ _description = "Jobs by Projects"$/;" v class:MerctransJobs -_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'MercTrans Invoices for Project Managers'$/;" v class:MercTransInvoices -_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'MercTrans Projects'$/;" v class:MercTransProjects -_description local-addons/merctrans_projects/models/merctrans_projects.py /^ _description = 'Services offered by MercTrans'$/;" v class:MercTransServices -_due_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _due_date_contrains(self):$/;" m class:MerctransJobs -_get_email_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_email_pic(self):$/;" m class:MerctransJobs -_get_id_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_id_pic(self):$/;" m class:MerctransJobs -_get_project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ def _get_project_id(self):$/;" m class:MercTransProjects -_get_project_source local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_source(self):$/;" m class:MerctransJobs -_get_project_target local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_target(self):$/;" m class:MerctransJobs -_get_project_valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_project_valid_date(self):$/;" m class:MerctransJobs -_get_street_pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _get_street_pic(self):$/;" m class:MerctransJobs -_inherit local-addons/merctrans_projects/models/merctrans_clients.py /^ _inherit = 'res.partner'$/;" v class:MerctransClient -_name local-addons/merctrans_projects/models/merctrans_clients.py /^ _name = 'merctrans.clients'$/;" v class:MerctransClient -_name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _name = 'merctrans.jobs'$/;" v class:MerctransJobs -_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.invoices'$/;" v class:MercTransInvoices -_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.projects'$/;" v class:MercTransProjects -_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _name = 'merctrans.services'$/;" v class:MercTransServices -_rec_name local-addons/merctrans_projects/models/merctrans_clients.py /^ _rec_name = 'name'$/;" v class:MerctransClient -_rec_name local-addons/merctrans_projects/models/merctrans_jobs.py /^ _rec_name = "title"$/;" v class:MerctransJobs -_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'invoice_name'$/;" v class:MercTransInvoices -_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'project_name'$/;" v class:MercTransProjects -_rec_name local-addons/merctrans_projects/models/merctrans_projects.py /^ _rec_name = 'services_names'$/;" v class:MercTransServices -_start_date_contrains local-addons/merctrans_projects/models/merctrans_jobs.py /^ def _start_date_contrains(self):$/;" m class:MerctransJobs -addons_path config-test/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options -addons_path config/odoo.conf /^addons_path = \/usr\/lib\/python3\/dist-packages\/odoo\/addons,\/mnt\/extra-addons$/;" k section:options -address local-addons/merctrans_projects/models/merctrans_jobs.py /^ address = fields.Char('Address',$/;" v class:MerctransJobs -admin_passwd config-test/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$\/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6/;" k section:options -admin_passwd config/odoo.conf /^admin_passwd = $pbkdf2-sha512$25000$PGcsJUQoBQBAaK01xhhDiA$\/NTAxCw1WKf.AhwdY8GSeD.g661WlpE0egA6/;" k section:options -channel_ids local-addons/merctrans_projects/models/merctrans_clients.py /^ channel_ids = fields.Many2many('res.partner',$/;" v class:MerctransClient -client local-addons/merctrans_projects/models/merctrans_projects.py /^ client = fields.Many2many('merctrans.clients', string='Clients', required=True)$/;" v class:MercTransProjects -client_currency local-addons/merctrans_projects/models/merctrans_clients.py /^ client_currency = fields.Many2one('res.currency',$/;" v class:MerctransClient -client_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -client_view_tree local-addons/merctrans_projects/views/clients.xml /^ $/;" i -create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransInvoices -create local-addons/merctrans_projects/models/merctrans_projects.py /^ def create(self, vals):$/;" m class:MercTransProjects -csv_internal_sep config-test/odoo.conf /^csv_internal_sep = ,$/;" k section:options -csv_internal_sep config/odoo.conf /^csv_internal_sep = ,$/;" k section:options -currency_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def currency_constrains(self):$/;" m class:MercTransInvoices -currency_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MerctransJobs -currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency', string='Currency')$/;" v class:MercTransInvoices -currency_id local-addons/merctrans_projects/models/merctrans_projects.py /^ currency_id = fields.Many2one('res.currency',$/;" v class:MercTransProjects -current_time local-addons/merctrans_projects/models/merctrans_projects.py /^ current_time = datetime.now().strftime("%Y%m%d-%H%M%s")$/;" v class:MercTransProjects -data_dir config-test/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options -data_dir config/odoo.conf /^data_dir = \/var\/lib\/odoo\/.local\/share\/Odoo$/;" k section:options -date_constrains local-addons/merctrans_projects/models/merctrans_projects.py /^ def date_constrains(self):$/;" m class:MercTransProjects -db_host config-test/odoo.conf /^db_host = db_test$/;" k section:options -db_host config/odoo.conf /^db_host = db$/;" k section:options -db_maxconn config-test/odoo.conf /^db_maxconn = 64$/;" k section:options -db_maxconn config/odoo.conf /^db_maxconn = 64$/;" k section:options -db_name config-test/odoo.conf /^db_name = merctrans_test$/;" k section:options -db_name config/odoo.conf /^db_name = merctrans$/;" k section:options -db_password config-test/odoo.conf /^db_password = odoo$/;" k section:options -db_password config/odoo.conf /^db_password = odoo$/;" k section:options -db_port config-test/odoo.conf /^db_port = 5432$/;" k section:options -db_port config/odoo.conf /^db_port = 5432$/;" k section:options -db_sslmode config-test/odoo.conf /^db_sslmode = prefer$/;" k section:options -db_sslmode config/odoo.conf /^db_sslmode = prefer$/;" k section:options -db_template config-test/odoo.conf /^db_template = template0$/;" k section:options -db_template config/odoo.conf /^db_template = template0$/;" k section:options -db_user config-test/odoo.conf /^db_user = odoo$/;" k section:options -db_user config/odoo.conf /^db_user = odoo$/;" k section:options -dbfilter config-test/odoo.conf /^dbfilter = $/;" k section:options -dbfilter config/odoo.conf /^dbfilter = $/;" k section:options -demo config-test/odoo.conf /^demo = {}$/;" k section:options -demo config/odoo.conf /^demo = False$/;" k section:options -department local-addons/merctrans_projects/models/merctrans_projects.py /^ department = fields.Selection(string="Department",$/;" v class:MercTransServices -department_list local-addons/merctrans_projects/models/merctrans_projects.py /^ department_list = [('localization', 'Localization'),$/;" v class:MercTransServices -discount local-addons/merctrans_projects/models/merctrans_projects.py /^ discount = fields.Integer(string='Discount (%)', default=0)$/;" v class:MercTransProjects -due_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ due_date = fields.Date(string='Due Date')$/;" v class:MerctransJobs -due_date local-addons/merctrans_projects/models/merctrans_projects.py /^ due_date = fields.Date(string='Due Date*', required=True)$/;" v class:MercTransProjects -email_from config-test/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options -email_from config/odoo.conf /^email_from = hoanglong@spiderum.com$/;" k section:options -geoip_database config-test/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options -geoip_database config/odoo.conf /^geoip_database = \/usr\/share\/GeoIP\/GeoLite2-City.mmdb$/;" k section:options -group_merctrans_contributor local-addons/merctrans_projects/security/security.xml /^ $/;" i -group_merctrans_pm local-addons/merctrans_projects/security/security.xml /^ $/;" i -http_enable config-test/odoo.conf /^http_enable = True$/;" k section:options -http_enable config/odoo.conf /^http_enable = True$/;" k section:options -http_interface config-test/odoo.conf /^http_interface = $/;" k section:options -http_interface config/odoo.conf /^http_interface = $/;" k section:options -http_port config-test/odoo.conf /^http_port = 8069$/;" k section:options -http_port config/odoo.conf /^http_port = 8069$/;" k section:options -import_partial config-test/odoo.conf /^import_partial = $/;" k section:options -import_partial config/odoo.conf /^import_partial = $/;" k section:options -increment_number_id local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -invoice_client local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_client = fields.Many2one('res.partner',$/;" v class:MercTransInvoices -invoice_date local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_date = fields.Date(string='Invoice Date')$/;" v class:MercTransInvoices -invoice_details_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_details_ids = fields.Many2many('merctrans.projects',$/;" v class:MercTransInvoices -invoice_id local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_id = fields.Integer('Invoice ID')$/;" v class:MercTransInvoices -invoice_name local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_name = fields.Char('Invoice name')$/;" v class:MercTransInvoices -invoice_status local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_status = fields.Selection(string="Invoice Status",$/;" v class:MercTransInvoices -invoice_value local-addons/merctrans_projects/models/merctrans_projects.py /^ invoice_value = fields.Monetary("Invoice Value",$/;" v class:MercTransInvoices -invoices_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -invoices_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_details local-addons/merctrans_projects/models/merctrans_projects.py /^ job_details = fields.Many2many("merctrans.jobs",$/;" v class:MercTransProjects -job_menu_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_view_form_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -job_view_tree local-addons/merctrans_projects/views/jobs.xml /^ $/;" i -job_view_tree_in_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -language_list local-addons/merctrans_projects/models/merctrans_projects.py /^ language_list = [('zh-CN', 'Chinese (Simplified)'),$/;" v class:MercTransProjects -limit_memory_hard config-test/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options -limit_memory_hard config/odoo.conf /^limit_memory_hard = 2684354560$/;" k section:options -limit_memory_soft config-test/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options -limit_memory_soft config/odoo.conf /^limit_memory_soft = 2147483648$/;" k section:options -limit_request config-test/odoo.conf /^limit_request = 8192$/;" k section:options -limit_request config/odoo.conf /^limit_request = 8192$/;" k section:options -limit_time_cpu config-test/odoo.conf /^limit_time_cpu = 60$/;" k section:options -limit_time_cpu config/odoo.conf /^limit_time_cpu = 60$/;" k section:options -limit_time_real config-test/odoo.conf /^limit_time_real = 120$/;" k section:options -limit_time_real config/odoo.conf /^limit_time_real = 120$/;" k section:options -limit_time_real_cron config-test/odoo.conf /^limit_time_real_cron = -1$/;" k section:options -limit_time_real_cron config/odoo.conf /^limit_time_real_cron = -1$/;" k section:options -list_db config-test/odoo.conf /^list_db = False$/;" k section:options -list_db config/odoo.conf /^list_db = False$/;" k section:options -log_db config-test/odoo.conf /^log_db = False$/;" k section:options -log_db config/odoo.conf /^log_db = False$/;" k section:options -log_db_level config-test/odoo.conf /^log_db_level = warning$/;" k section:options -log_db_level config/odoo.conf /^log_db_level = warning$/;" k section:options -log_handler config-test/odoo.conf /^log_handler = :INFO$/;" k section:options -log_handler config/odoo.conf /^log_handler = :INFO$/;" k section:options -log_level config-test/odoo.conf /^log_level = info$/;" k section:options -log_level config/odoo.conf /^log_level = info$/;" k section:options -logfile config-test/odoo.conf /^logfile = $/;" k section:options -logfile config/odoo.conf /^logfile = $/;" k section:options -longpolling_port config-test/odoo.conf /^longpolling_port = 8072$/;" k section:options -longpolling_port config/odoo.conf /^longpolling_port = 8072$/;" k section:options -max_cron_threads config-test/odoo.conf /^max_cron_threads = 2$/;" k section:options -max_cron_threads config/odoo.conf /^max_cron_threads = 2$/;" k section:options -mectrans_jobs_user_rule local-addons/merctrans_projects/security/security_rules.xml /^ $/;" i -merctrans_clients_actions local-addons/merctrans_projects/views/clients.xml /^ $/;" i -merctrans_invoices_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -merctrans_jobs_actions local-addons/merctrans_projects/views/jobs.xml /^ $/;" i -merctrans_jobs_view_search local-addons/merctrans_projects/views/jobs.xml /^ $/;" i -merctrans_projects_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -merctrans_services_action local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -module_category_merctransproject local-addons/merctrans_projects/security/security.xml /^ $/;" i -number_id local-addons/merctrans_projects/models/merctrans_projects.py /^ number_id = fields.Integer('No number',$/;" v class:MercTransProjects -options config-test/odoo.conf /^[options]$/;" s -options config/odoo.conf /^[options]$/;" s -osv_memory_age_limit config-test/odoo.conf /^osv_memory_age_limit = False$/;" k section:options -osv_memory_age_limit config/odoo.conf /^osv_memory_age_limit = False$/;" k section:options -osv_memory_count_limit config-test/odoo.conf /^osv_memory_count_limit = False$/;" k section:options -osv_memory_count_limit config/odoo.conf /^osv_memory_count_limit = False$/;" k section:options -payment_status local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status = fields.Selection(string='Payment Status',$/;" v class:MercTransProjects -payment_status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'),$/;" v class:MercTransProjects -pg_path config-test/odoo.conf /^pg_path = $/;" k section:options -pg_path config/odoo.conf /^pg_path = $/;" k section:options -pic local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic = fields.Many2one('res.users', 'PIC', required=True)$/;" v class:MerctransJobs -pic_email local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_email = fields.Char('Email',$/;" v class:MerctransJobs -pic_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ pic_id = fields.Char('Id',$/;" v class:MerctransJobs -pidfile config-test/odoo.conf /^pidfile = $/;" k section:options -pidfile config/odoo.conf /^pidfile = $/;" k section:options -project_base_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -project_id local-addons/merctrans_projects/models/merctrans_jobs.py /^ project_id = fields.Many2one('merctrans.projects',$/;" v class:MerctransJobs -project_id local-addons/merctrans_projects/models/merctrans_projects.py /^ project_id = fields.Char('Project Id',$/;" v class:MercTransProjects -project_instruction local-addons/merctrans_projects/models/merctrans_projects.py /^ project_instruction = fields.Html('Project Instruction')$/;" v class:MercTransProjects -project_manager local-addons/merctrans_projects/models/merctrans_projects.py /^ project_manager = fields.Many2one('res.users',$/;" v class:MercTransProjects -project_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -project_view_tree local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -proxy_mode config-test/odoo.conf /^proxy_mode = False$/;" k section:options -proxy_mode config/odoo.conf /^proxy_mode = False$/;" k section:options -reportgz config-test/odoo.conf /^reportgz = False$/;" k section:options -reportgz config/odoo.conf /^reportgz = False$/;" k section:options -sale_rate_per_work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit',$/;" v class:MercTransProjects -screencasts config-test/odoo.conf /^screencasts = $/;" k section:options -screencasts config/odoo.conf /^screencasts = $/;" k section:options -screenshots config-test/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options -screenshots config/odoo.conf /^screenshots = \/tmp\/odoo_tests$/;" k section:options -server_wide_modules config-test/odoo.conf /^server_wide_modules = base,web$/;" k section:options -server_wide_modules config/odoo.conf /^server_wide_modules = base,web$/;" k section:options -services_ids local-addons/merctrans_projects/models/merctrans_projects.py /^ services_ids = fields.Many2many('merctrans.services', string='Services')$/;" v class:MercTransProjects -services_menu local-addons/merctrans_projects/views/projects_menus.xml /^ $/;" i -smtp_password config-test/odoo.conf /^smtp_password = False$/;" k section:options -smtp_password config/odoo.conf /^smtp_password = False$/;" k section:options -smtp_port config-test/odoo.conf /^smtp_port = 25$/;" k section:options -smtp_port config/odoo.conf /^smtp_port = 25$/;" k section:options -smtp_server config-test/odoo.conf /^smtp_server = localhost$/;" k section:options -smtp_server config/odoo.conf /^smtp_server = localhost$/;" k section:options -smtp_ssl config-test/odoo.conf /^smtp_ssl = False$/;" k section:options -smtp_ssl config/odoo.conf /^smtp_ssl = False$/;" k section:options -smtp_user config-test/odoo.conf /^smtp_user = False$/;" k section:options -smtp_user config/odoo.conf /^smtp_user = False$/;" k section:options -source_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ source_language = fields.Char('Source Language',$/;" v class:MerctransJobs -source_language local-addons/merctrans_projects/models/merctrans_projects.py /^ source_language = fields.Selection(string="Source Languages",$/;" v class:MercTransProjects -start_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ start_date = fields.Date(string='Start Date')$/;" v class:MerctransJobs -start_date local-addons/merctrans_projects/models/merctrans_projects.py /^ start_date = fields.Date(string='Start Date*', required=True)$/;" v class:MercTransProjects -status_list local-addons/merctrans_projects/models/merctrans_projects.py /^ status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'),$/;" v class:MercTransInvoices -sync_status local-addons/merctrans_projects/models/merctrans_projects.py /^ def sync_status(self):$/;" m class:MercTransInvoices -syslog config-test/odoo.conf /^syslog = False$/;" k section:options -syslog config/odoo.conf /^syslog = False$/;" k section:options -target_language local-addons/merctrans_projects/models/merctrans_jobs.py /^ target_language = fields.Char('Target Language',$/;" v class:MerctransJobs -target_language local-addons/merctrans_projects/models/merctrans_projects.py /^ target_language = fields.Selection(string="Target Language",$/;" v class:MercTransProjects -test_enable config-test/odoo.conf /^test_enable = False$/;" k section:options -test_enable config/odoo.conf /^test_enable = False$/;" k section:options -test_file config-test/odoo.conf /^test_file = $/;" k section:options -test_file config/odoo.conf /^test_file = $/;" k section:options -test_tags config-test/odoo.conf /^test_tags = None$/;" k section:options -test_tags config/odoo.conf /^test_tags = None$/;" k section:options -title local-addons/merctrans_projects/models/merctrans_jobs.py /^ title = fields.Char('Job Title', default='Job Title')$/;" v class:MerctransJobs -transient_age_limit config-test/odoo.conf /^transient_age_limit = 1.0$/;" k section:options -transient_age_limit config/odoo.conf /^transient_age_limit = 1.0$/;" k section:options -translate_modules config-test/odoo.conf /^translate_modules = ['all']$/;" k section:options -translate_modules config/odoo.conf /^translate_modules = ['all']$/;" k section:options -unaccent config-test/odoo.conf /^unaccent = False$/;" k section:options -unaccent config/odoo.conf /^unaccent = False$/;" k section:options -upgrade_path config-test/odoo.conf /^upgrade_path = $/;" k section:options -upgrade_path config/odoo.conf /^upgrade_path = $/;" k section:options -valid_date local-addons/merctrans_projects/models/merctrans_jobs.py /^ valid_date = fields.Char('Valid Date',$/;" v class:MerctransJobs -volume local-addons/merctrans_projects/models/merctrans_projects.py /^ volume = fields.Integer(string='Project Volume*', required=True, default=0)$/;" v class:MercTransProjects -without_demo config-test/odoo.conf /^without_demo = True$/;" k section:options -without_demo config/odoo.conf /^without_demo = True$/;" k section:options -work_unit local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit = fields.Selection(string='Work Unit*',$/;" v class:MercTransProjects -work_unit_list local-addons/merctrans_projects/models/merctrans_projects.py /^ work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'),$/;" v class:MercTransProjects -workers config-test/odoo.conf /^workers = 0$/;" k section:options -workers config/odoo.conf /^workers = 0$/;" k section:options -write local-addons/merctrans_projects/models/merctrans_projects.py /^ def write(self, vals):$/;" m class:MercTransInvoices From 6079704bfface0d6f14dc5bc39761ec6e62f212a Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 7 Jul 2022 09:26:09 +0700 Subject: [PATCH 24/74] fix job, project database and view --- .gitignore | 4 +- .../models/merctrans_jobs.py | 41 ++++++++++++++++--- .../models/merctrans_projects.py | 23 +++++++---- local-addons/merctrans_projects/odoo_pg_pass | 0 .../merctrans_projects/views/jobs.xml | 7 ++++ .../views/projects_menus.xml | 8 ++-- 6 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 local-addons/merctrans_projects/odoo_pg_pass diff --git a/.gitignore b/.gitignore index 2e72cc6..d4b955b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ venv local-addons/merctrans_projects/__pycache__ local-addons/merctrans_projects/controllers/__pycache__ -local-addons/merctrans_projects/models/__pycache__ \ No newline at end of file +local-addons/merctrans_projects/models/__pycache__ +odoo +tags \ No newline at end of file diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py index c8e6d11..e956c06 100755 --- a/local-addons/merctrans_projects/models/merctrans_jobs.py +++ b/local-addons/merctrans_projects/models/merctrans_jobs.py @@ -7,12 +7,14 @@ class MerctransJobs(models.Model): _name = 'merctrans.jobs' _description = "Jobs by Projects" _rec_name = "title" - project_status_list = [('potential', 'Potential'), - ('confirmed', 'Confirmed'), - ('in progress', 'In Progress'), ('in qa', 'In QA'), - ('delivered', 'Delivered'), - ('canceled', 'Canceled')] + job_status_list = [('in progress', 'In Progress'), + ('completed', 'Completed'), ('canceled', 'Canceled')] + work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), + ('job', 'Job')] + + payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), + ('paid', 'Paid')] # Detail Job title = fields.Char('Job Title', default='Job Title') @@ -39,6 +41,23 @@ class MerctransJobs(models.Model): readonly=True, compute='_get_project_target') currency_id = fields.Many2one('res.currency', string='Currency') + work_unit = fields.Selection(string='Work Unit*', + selection=work_unit_list, + required=True) + volume = fields.Integer(string='Volume*', required=True, default=0) + + sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', + required=True, + default=0) + payment_status = fields.Selection(string='Payment Status', + selection=payment_status_list, + default='Payment Status') + + job_value = fields.Float("Project Value", + compute="_compute_job_value", + store=True, + readonly=True, + default=0) valid_date = fields.Char('Valid Date', default="Choose Project", readonly=True, @@ -53,7 +72,8 @@ class MerctransJobs(models.Model): string="Project", required=True) job_status = fields.Selection(string='JOB STATUS', - selection=project_status_list) + selection=job_status_list) + service = fields.Many2one('merctrans.services', string='Service') # Currency - get from partner Currency @@ -136,3 +156,12 @@ def _constraint_date(self): if project.start_date > project.due_date: raise ValidationError( 'Due date must be greater than Start date!') + + # workunit + @api.onchange('volume', 'rate_per_work_unit') + @api.depends('volume', 'sale_rate_per_work_unit') + def _compute_job_value(self): + for project in self: + project.job_value = ( + 100 - + 0) / 100 * project.volume * project.sale_rate_per_work_unit diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index b598c42..6ebdaca 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -71,6 +71,11 @@ class MercTransProjects(models.Model): string='Clients', required=True) + client_name = fields.Char('Client_', + compute='_get_client_name', + default='merctrans', + readonly=True) + # compute project_id by client many 2 one -> should default value client_name # services contain tags services_ids = fields.Many2many('merctrans.services', string='Services') @@ -88,7 +93,7 @@ class MercTransProjects(models.Model): work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True) - volume = fields.Integer(string='Project Volume*', required=True, default=0) + volume = fields.Integer(string='Volume*', required=True, default=0) currency_id = fields.Many2one('res.currency', string='Currency*', required=True) @@ -117,12 +122,13 @@ class MercTransProjects(models.Model): job_details = fields.Many2many("merctrans.jobs", string="Jobs in this Project") - # def _get_client_name(self): self.client_name = 'default bug' - # for record in self: - # if record.client: - # record.client_name = record.client.name - # else: - # record.client_name = 'default bug' + def _get_client_name(self): + self.client_name = '' + for record in self: + if record.client: + record.client_name += record.client.name + else: + record.client_name = 'default bug' @api.model def create(self, vals): @@ -146,7 +152,8 @@ def _get_project_id(self): for project in self: if project.client: # client is many2many nen can chinh sua lai 1 chut, chi lay ten cua thang dau tien, should be change with project.client - client_name = project.client.name + client_name = project.client[0].name if len( + project.client) > 1 else project.client.name short_name = client_name[:4].upper() project.project_id = f"{short_name}-{create_time}-{project.number_id}" else: diff --git a/local-addons/merctrans_projects/odoo_pg_pass b/local-addons/merctrans_projects/odoo_pg_pass new file mode 100644 index 0000000..e69de29 diff --git a/local-addons/merctrans_projects/views/jobs.xml b/local-addons/merctrans_projects/views/jobs.xml index 62c8760..e6d5e00 100755 --- a/local-addons/merctrans_projects/views/jobs.xml +++ b/local-addons/merctrans_projects/views/jobs.xml @@ -19,6 +19,7 @@ + @@ -30,7 +31,13 @@ + + + + + + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index b85d19b..bb9da4a 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -167,23 +167,21 @@ + + - - - - + - From 7c12c4da9e588491ecf30ec3fe2c04a519909ea2 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 7 Jul 2022 10:02:03 +0700 Subject: [PATCH 25/74] delete secret --- docker-compose.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index dd229b8..fbb4d15 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,8 +13,6 @@ services: environment: - USER=odoo - PASSWORD=odoo - secrets: - - postgresql_password db: image: postgres:13 environment: @@ -24,12 +22,10 @@ services: - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata - secrets: - - postgresql_password volumes: odoo-web-data: odoo-db-data: - \ No newline at end of file + From f9316e6c274dd130eb10a02c12d512497ff8000e Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 8 Jul 2022 12:25:46 +0700 Subject: [PATCH 26/74] fix bug many2one --- .../merctrans_projects/models/merctrans_projects.py | 8 +++++--- local-addons/merctrans_projects/views/projects_menus.xml | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 6ebdaca..0b07e8b 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -67,9 +67,11 @@ class MercTransProjects(models.Model): 'Project Name', default=lambda self: f"Project No {self.env['merctrans.projects'].search_count([])}") - client = fields.Many2many('merctrans.clients', - string='Clients', - required=True) + client = fields.Many2one('merctrans.clients', + string='Clients', + required=True, + default=lambda self: self.env['merctrans.clients'] + .search([('name', '=', 'merctrans')], limit=1)) client_name = fields.Char('Client_', compute='_get_client_name', diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index bb9da4a..f095085 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -134,7 +134,7 @@ - + @@ -167,7 +167,8 @@ - + + From 6c9ded0cd294f8958750e338abcb7a885df4afe7 Mon Sep 17 00:00:00 2001 From: Hoang Long <83296144+hglong16@users.noreply.github.com> Date: Wed, 13 Jul 2022 10:56:15 +0700 Subject: [PATCH 27/74] Update README.md --- README.md | 66 +------------------------------------------------------ 1 file changed, 1 insertion(+), 65 deletions(-) diff --git a/README.md b/README.md index 102c455..a956220 100644 --- a/README.md +++ b/README.md @@ -1,65 +1 @@ -txt -version: "3.1" -services: - web_prod: - image: odoo:14.0 - depends_on: - - db - ports: - - "8069:8069" - volumes: - - odoo-web-data:/var/lib/odoo - - ./config:/etc/odoo - - ./local-addons:/mnt/extra-addons - environment: - - USER=odoo - - PASSWORD=odoo - secrets: - - postgresql_password - db: - image: postgres:13 - environment: - - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=odoo - - POSTGRES_USER=odoo - - PGDATA=/var/lib/postgresql/data/pgdata - volumes: - - odoo-db-data:/var/lib/postgresql/data/pgdata - secrets: - - postgresql_password - web_test: - image: odoo:14.0 - depends_on: - - db_test - ports: - - "8079:8069" - volumes: - - odoo-web-data-test:/var/lib/odoo - - ./config-test:/etc/odoo - - ./local-addons:/mnt/extra-addons - environment: - - USER=odoo - - PASSWORD=odoo - db_test: - image: postgres:13 - environment: - - POSTGRES_DB=postgres - - POSTGRES_PASSWORD=odoo - - POSTGRES_USER=odoo - - PGDATA=/var/lib/postgresql/data/pgdata - ports: - - 5435:5432 - volumes: - - odoo-db-data-test:/var/lib/postgresql/data/pgdata - secrets: - - postgresql_password - -volumes: - odoo-web-data: - odoo-db-data: - odoo-web-data-test: - odoo-db-data-test: - -secrets: - postgresql_password: - file: odoo_pg_pass +# Merctrans Project Manager From b17db7d3d1935829829f87fc9af21c242866c621 Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 13 Jul 2022 11:50:29 +0700 Subject: [PATCH 28/74] Closes #3 --- .../merctrans_projects/__manifest__.py | 4 ++- .../merctrans_projects/data/currencies.xml | 33 +++++++++++++++++++ .../models/merctrans_clients.py | 28 +++++++++++----- .../models/merctrans_projects.py | 17 +++++++--- .../merctrans_projects/views/clients.xml | 4 +++ .../views/projects_menus.xml | 11 ++++--- 6 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 local-addons/merctrans_projects/data/currencies.xml diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index 1f55e60..0714d12 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -25,7 +25,7 @@ '0.1', # any module necessary for this one to work correctly - 'depends': ['base', 'sale'], + 'depends': ['base'], # always loaded 'data': [ @@ -39,6 +39,8 @@ 'views/projects_menus.xml', 'views/templates.xml', # 'views/sale.xml', + #data + 'data/currencies.xml' ], # only loaded in demonstration mode 'demo': [ diff --git a/local-addons/merctrans_projects/data/currencies.xml b/local-addons/merctrans_projects/data/currencies.xml new file mode 100644 index 0000000..a4b6406 --- /dev/null +++ b/local-addons/merctrans_projects/data/currencies.xml @@ -0,0 +1,33 @@ + + + + + + USD + $ + 0.01 + + before + Dollars + Cents + + + + VEF + Bs.F + 0.0001 + + Bolivar + Centimos + + + + CAD + $ + 0.01 + + Dollars + Cents + + + \ No newline at end of file diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index f4170b8..74f48dd 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -1,22 +1,32 @@ +import re from odoo.exceptions import ValidationError - from odoo import api, fields, models class MerctransClient(models.Model): _name = 'merctrans.clients' _rec_name = 'name' - _inherits = {'res.partner': 'partner_id'} - _description = "Merctrans's Partner" + _description = "Merctrans's Clients" # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - name = fields.Char(related='partner_id.name', - inherited=True, - readonly=False) - email = fields.Char(related='partner_id.email', - inherited=True, - readonly=False) + name = fields.Char(string='Client') + email = fields.Char(string='Email') client_note = fields.Html('Client note') + phone_number = fields.Char(string='Phone number') + website = fields.Char(string='Website') # client_currency = fields.Many2one('res.currency', # string="Currency",) + @api.constrains('name') + def check_duplicate_name(self): + for company_rec in self: + company_rec = self.env['merctrans.clients'].search([('name', '=', self.name), ('id', '!=', self.id)]) + if company_rec: + raise ValidationError('Company name cannot be duplicated!') + + @api.constrains('email') + def validate_email(self): + if self.email: + match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', self.email) + if match == None: + raise ValidationError('Not a valid email') \ No newline at end of file diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 0b07e8b..10e0c50 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -18,6 +18,12 @@ class MercTransServices(models.Model): selection=department_list) services_names = fields.Char('Services') +class MercTransTags(models.Model): + _name = 'merctrans.tags' + _rec_name = 'tag' + _description = 'Project Tags' + + tag = fields.Char(string='Tag', required=True) class MercTransProjects(models.Model): _name = 'merctrans.projects' @@ -61,6 +67,7 @@ class MercTransProjects(models.Model): default="new_project", readonly=True, compute="_get_project_id") + tags = fields.Many2many('merctrans.tags',string='Tags') current_time = datetime.now().strftime("%Y%m%d-%H%M%s") project_name = fields.Char( @@ -99,9 +106,9 @@ class MercTransProjects(models.Model): currency_id = fields.Many2one('res.currency', string='Currency*', required=True) - sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', - required=True, - default=0) + sale_rate = fields.Float(string='Rate*', + required=True, + default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') job_value = fields.Float("Project Value", compute="_compute_job_value", @@ -162,12 +169,12 @@ def _get_project_id(self): project.project_id = "on change" @api.onchange('volume', 'rate_per_work_unit') - @api.depends('volume', 'sale_rate_per_work_unit', 'discount') + @api.depends('volume', 'sale_rate', 'discount') def _compute_job_value(self): for project in self: project.job_value = ( 100 - project.discount - ) / 100 * project.volume * project.sale_rate_per_work_unit + ) / 100 * project.volume * project.sale_rate @api.constrains('start_date', 'due_date') def date_constrains(self): diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 7ab0d20..c5475b4 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -15,6 +15,8 @@ + + @@ -39,6 +41,8 @@ + + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index f095085..f43fe78 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -70,7 +70,7 @@ - + @@ -136,8 +136,9 @@ + - + @@ -167,6 +168,7 @@ + @@ -175,14 +177,15 @@ - + - + + From e1b1566b1c6a199f8aa71159da5a7e0021256a2d Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 13 Jul 2022 19:24:09 +0700 Subject: [PATCH 29/74] Fix default currencies --- .../merctrans_projects/data/currencies.xml | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/local-addons/merctrans_projects/data/currencies.xml b/local-addons/merctrans_projects/data/currencies.xml index a4b6406..3f128c3 100644 --- a/local-addons/merctrans_projects/data/currencies.xml +++ b/local-addons/merctrans_projects/data/currencies.xml @@ -2,6 +2,7 @@ + USD $ @@ -12,22 +13,22 @@ Cents - - VEF - Bs.F - 0.0001 + + EUR + + 0.01 - Bolivar - Centimos + Euros + Cents - - CAD - $ - 0.01 + + VND + + 1.00 - Dollars - Cents + Dong + Xu \ No newline at end of file From e14da0d4639b35bc384433cfd867bb4905632732 Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 06:09:55 +0700 Subject: [PATCH 30/74] some changes --- local-addons/merctrans_projects/models/merctrans_clients.py | 1 + 1 file changed, 1 insertion(+) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 74f48dd..342b01d 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -15,6 +15,7 @@ class MerctransClient(models.Model): client_note = fields.Html('Client note') phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') + # client_currency = fields.Many2one('res.currency', # string="Currency",) @api.constrains('name') From 97e6ed6e480fdc7a81331ad10e159481847fc068 Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 06:14:36 +0700 Subject: [PATCH 31/74] fix currencies --- .../models/merctrans_clients.py | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index f4170b8..74f48dd 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -1,22 +1,32 @@ +import re from odoo.exceptions import ValidationError - from odoo import api, fields, models class MerctransClient(models.Model): _name = 'merctrans.clients' _rec_name = 'name' - _inherits = {'res.partner': 'partner_id'} - _description = "Merctrans's Partner" + _description = "Merctrans's Clients" # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - name = fields.Char(related='partner_id.name', - inherited=True, - readonly=False) - email = fields.Char(related='partner_id.email', - inherited=True, - readonly=False) + name = fields.Char(string='Client') + email = fields.Char(string='Email') client_note = fields.Html('Client note') + phone_number = fields.Char(string='Phone number') + website = fields.Char(string='Website') # client_currency = fields.Many2one('res.currency', # string="Currency",) + @api.constrains('name') + def check_duplicate_name(self): + for company_rec in self: + company_rec = self.env['merctrans.clients'].search([('name', '=', self.name), ('id', '!=', self.id)]) + if company_rec: + raise ValidationError('Company name cannot be duplicated!') + + @api.constrains('email') + def validate_email(self): + if self.email: + match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', self.email) + if match == None: + raise ValidationError('Not a valid email') \ No newline at end of file From 081730d4642261cf26aac709fe6903b1d30df6ee Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 10:20:41 +0700 Subject: [PATCH 32/74] job in project, bug has some but --- .../models/merctrans_jobs.py | 127 ++++++++++-------- .../models/merctrans_projects.py | 55 +++++--- .../security/security_rules.xml | 2 +- .../merctrans_projects/views/jobs.xml | 14 +- .../views/projects_menus.xml | 89 +++++++----- 5 files changed, 172 insertions(+), 115 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py index e956c06..1eb800d 100755 --- a/local-addons/merctrans_projects/models/merctrans_jobs.py +++ b/local-addons/merctrans_projects/models/merctrans_jobs.py @@ -4,9 +4,15 @@ class MerctransJobs(models.Model): + """ + Khoi tao model + """ _name = 'merctrans.jobs' _description = "Jobs by Projects" - _rec_name = "title" + _rec_name = "purchase_order" + """ + Static List + """ job_status_list = [('in progress', 'In Progress'), ('completed', 'Completed'), ('canceled', 'Canceled')] @@ -16,31 +22,25 @@ class MerctransJobs(models.Model): payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] # Detail Job - - title = fields.Char('Job Title', default='Job Title') - pic = fields.Many2one('res.users', 'PIC', required=True) + """ + Field and API Decorate + """ + # NOTE: NON-inherit from project page + purchase_order = fields.Char('Purchase Order', default='Purchase Order') + contributor = fields.Many2one('res.users', 'Contributor', required=True) address = fields.Char('Address', store=True, readonly=True, - compute='_get_street_pic') - pic_id = fields.Char('Id', - store=True, - readonly=True, - compute='_get_id_pic') - pic_email = fields.Char('Email', - store=True, - readonly=True, - compute='_get_email_pic') - source_language = fields.Char('Source Language', - default="English", - store=True, - compute='_get_project_source', - readonly=True) - target_language = fields.Char('Target Language', - default="Vietnamess", - readonly=True, - compute='_get_project_target') - currency_id = fields.Many2one('res.currency', string='Currency') + compute='_get_street_contributor') + contributor_id = fields.Char('Id', + store=True, + readonly=True, + compute='_get_id_contributor') + contributor_email = fields.Char('Email', + store=True, + readonly=True, + compute='_get_email_contributor') + work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True) @@ -58,61 +58,77 @@ class MerctransJobs(models.Model): store=True, readonly=True, default=0) + job_status = fields.Selection(string='JOB STATUS', + selection=job_status_list) + service = fields.Many2one('merctrans.services', string='Service') + # NOTE: INHERIT FROM PROJECT + source_language = fields.Char('Source Language', + default="English", + store=True, + compute='_get_project_source', + readonly=True) + target_language = fields.Char('Target Language', + default="Vietnamess", + readonly=True, + compute='_get_project_target') + currency_id = fields.Many2one('res.currency', string='Currency') valid_date = fields.Char('Valid Date', default="Choose Project", readonly=True, compute='_get_project_valid_date') - start_date = fields.Date(string='Start Date') - due_date = fields.Date(string='Due Date') + start_date = fields.Date( + string='Start Date') #, default="_get_start_date") + due_date = fields.Date(string='Due Date') #, default="_get_due_date") # TODO: code = auto gen code unique # From Projects? project_id = fields.Many2one('merctrans.projects', string="Project", - required=True) - job_status = fields.Selection(string='JOB STATUS', - selection=job_status_list) - service = fields.Many2one('merctrans.services', string='Service') - - # Currency - get from partner Currency - - # TODO: - Cần thêm fields currency cho res.partner + store=True) - # TODO: - Cần thêm fields rate cho model -> but? Tính kiểu ? - - # get Source default - - # TODO: Sau khi có currency change street = currency EZ??? - - # Get pic address - @api.onchange('pic') - @api.depends('pic') - def _get_street_pic(self): + # Get contributor address + @api.onchange('contributor') + @api.depends('contributor') + def _get_street_contributor(self): self.ensure_one() - print(self.pic.street) - self.address = self.pic.street + print(self.contributor.street) + self.address = self.contributor.street # Get api email - @api.onchange('pic') - @api.depends('pic') - def _get_email_pic(self): + @api.onchange('contributor') + @api.depends('contributor') + def _get_email_contributor(self): for project in self: - print(project.pic.email) - project.pic_email = project.pic.email + print(project.contributor.email) + project.contributor_email = project.contributor.email - @api.onchange('pic') - @api.depends('pic') - def _get_id_pic(self): + @api.onchange('contributor') + @api.depends('contributor') + def _get_id_contributor(self): for project in self: - print(project.pic.id) - project.pic_id = project.pic.id + print(project.contributor.id) + project.contributor_id = project.contributor.id @api.onchange('project_id') @api.depends('project_id') def _get_project_source(self): self.source_language = self.project_id.source_language + # @api.onchange('project_id') + # @api.depends('project_id') + # def _get_start_date(self): + # for project in self: + # if project.project_id.start_date: + # return project.project_id.start_date + # + # @api.onchange('project_id') + # @api.depends('project_id') + # def _get_due_date(self): + # for project in self: + # if project.project_id.start_date: + # return project.project_id.due_date + @api.onchange('project_id') @api.depends('project_id') def _get_project_valid_date(self): @@ -133,7 +149,6 @@ def _get_project_target(self): @api.constrains('start_date', 'project_id') def _start_date_contrains(self): for project in self: - print(project.start_date, project.project_id.start_date) if project.start_date < project.project_id.start_date: raise ValidationError( f'Start date must be greater than project start date: {project.project_id.start_date}' diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 10e0c50..590ad29 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -18,6 +18,7 @@ class MercTransServices(models.Model): selection=department_list) services_names = fields.Char('Services') + class MercTransTags(models.Model): _name = 'merctrans.tags' _rec_name = 'tag' @@ -25,10 +26,17 @@ class MercTransTags(models.Model): tag = fields.Char(string='Tag', required=True) + class MercTransProjects(models.Model): + """ + Khởi tạo model + """ _name = 'merctrans.projects' _description = 'MercTrans Projects' _rec_name = 'project_name' + """ + Static list + """ language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), @@ -59,6 +67,12 @@ class MercTransProjects(models.Model): # default=lambda self: self.env['ir.sequence']. # next_by_code('increment_number_id')) # Auto gen number_id + """ + Field and decorate function, được nhóm chung vào từng section + để thuận tiện hơn trong chỉnh sửa và debug + """ + + # NOTE: ID and Project ID, project name, client, tags number_id = fields.Integer('No number', index=True, readonly=True, @@ -67,34 +81,45 @@ class MercTransProjects(models.Model): default="new_project", readonly=True, compute="_get_project_id") - tags = fields.Many2many('merctrans.tags',string='Tags') - current_time = datetime.now().strftime("%Y%m%d-%H%M%s") project_name = fields.Char( 'Project Name', default=lambda self: f"Project No {self.env['merctrans.projects'].search_count([])}") + client = fields.Many2one('merctrans.clients', string='Clients', required=True, default=lambda self: self.env['merctrans.clients'] .search([('name', '=', 'merctrans')], limit=1)) + services_ids = fields.Many2many('merctrans.services', string='Services') client_name = fields.Char('Client_', compute='_get_client_name', default='merctrans', readonly=True) + tags = fields.Many2many('merctrans.tags', string='Tags') + project_manager = fields.Many2one('res.users', + string='Project Manager*', + required=True) # compute project_id by client many 2 one -> should default value client_name # services contain tags - services_ids = fields.Many2many('merctrans.services', string='Services') - project_instruction = fields.Html('Project Instruction') + # NOTE: Target and Source Language source_language = fields.Selection(string="Source Languages", selection=language_list, default="Select a language") target_language = fields.Selection(string="Target Language", selection=language_list, default="Select a language") + + # NOTE: TIME, START and DUE DATE + current_time = datetime.now().strftime("%Y%m%d-%H%M%s") + start_date = fields.Date(string='Start Date*', required=True) + due_date = fields.Date(string='Due Date*', required=True) + + # NOTE: SALE, Volume, unit, rate + discount = fields.Integer(string='Discount (%)', default=0) # add discount field # fixed job @@ -106,21 +131,16 @@ class MercTransProjects(models.Model): currency_id = fields.Many2one('res.currency', string='Currency*', required=True) - sale_rate = fields.Float(string='Rate*', - required=True, - default=0) + sale_rate = fields.Float(string='Rate*', required=True, default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') job_value = fields.Float("Project Value", compute="_compute_job_value", store=True, readonly=True, default=0) + # NOTE: PROJECT STATUS - project_manager = fields.Many2one('res.users', - string='Project Manager*', - required=True) - start_date = fields.Date(string='Start Date*', required=True) - due_date = fields.Date(string='Due Date*', required=True) + project_instruction = fields.Html('Project Instruction') project_status = fields.Selection(string='Project Status', selection=project_status_list, required=True, @@ -128,8 +148,10 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, default='Payment Status') - job_details = fields.Many2many("merctrans.jobs", - string="Jobs in this Project") + + job_details = fields.One2many("merctrans.jobs", + "project_id", + string="Jobs in this Project") def _get_client_name(self): self.client_name = '' @@ -172,9 +194,8 @@ def _get_project_id(self): @api.depends('volume', 'sale_rate', 'discount') def _compute_job_value(self): for project in self: - project.job_value = ( - 100 - project.discount - ) / 100 * project.volume * project.sale_rate + project.job_value = (100 - project.discount + ) / 100 * project.volume * project.sale_rate @api.constrains('start_date', 'due_date') def date_constrains(self): diff --git a/local-addons/merctrans_projects/security/security_rules.xml b/local-addons/merctrans_projects/security/security_rules.xml index 0b0c617..0b2e284 100755 --- a/local-addons/merctrans_projects/security/security_rules.xml +++ b/local-addons/merctrans_projects/security/security_rules.xml @@ -5,7 +5,7 @@ - [('pic_id','=',user.id)] + [('contributor_id','=',user.id)] diff --git a/local-addons/merctrans_projects/views/jobs.xml b/local-addons/merctrans_projects/views/jobs.xml index e6d5e00..e2f220f 100755 --- a/local-addons/merctrans_projects/views/jobs.xml +++ b/local-addons/merctrans_projects/views/jobs.xml @@ -16,8 +16,8 @@
- - + + @@ -28,9 +28,9 @@ - + - + @@ -50,15 +50,15 @@ merctrans.jobs - + - + - + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index f43fe78..1a11ce5 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -40,7 +40,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -120,35 +120,62 @@ - - - - + + + - - - + - - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -168,7 +195,7 @@ - + @@ -178,14 +205,12 @@ - - - + - - + +
@@ -198,7 +223,7 @@
- + @@ -208,9 +233,9 @@ - + - + @@ -224,22 +249,18 @@ merctrans.jobs - + - + - - + - - - From af3de1e721f52cb418f434ba44e9e7b0a3fdac4e Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 08:16:20 +0700 Subject: [PATCH 33/74] fix create in project view, fix order in project, fix client country --- .../merctrans_projects/models/merctrans_clients.py | 4 +++- .../models/merctrans_projects.py | 9 +++++++++ local-addons/merctrans_projects/views/clients.xml | 1 + .../merctrans_projects/views/projects_menus.xml | 14 +++++++------- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 342b01d..28e3cc4 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -12,6 +12,7 @@ class MerctransClient(models.Model): # string='Related Partner', help='Partner-related data of the user') name = fields.Char(string='Client') email = fields.Char(string='Email') + country = fields.Many2one('res.country', string='Country') client_note = fields.Html('Client note') phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') @@ -30,4 +31,5 @@ def validate_email(self): if self.email: match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', self.email) if match == None: - raise ValidationError('Not a valid email') \ No newline at end of file + raise ValidationError('Not a valid email') + diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 590ad29..55c0214 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -259,3 +259,12 @@ def sync_status(self): project.write({'payment_status': 'paid'}) if self.invoice_status == 'invoiced': project.write({'payment_status': 'invoiced'}) + + @api.onchange('invoice_client') + def onchange_client_name(self): + res = {} + res['domain'] = {'invoice_detail_ids':[]} + for rec in self: + if rec.invoice_client: + res['domain']['invoice_detail_ids'].append(('invoice_client', '=', rec.invoice_client)) + return res diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index c5475b4..dad7ce5 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -14,6 +14,7 @@ + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 1a11ce5..3e54649 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -65,7 +65,7 @@ - + @@ -121,7 +121,7 @@ - + @@ -195,20 +195,20 @@ - - + - - + - + + + From 6b53ff07ecb7a276c754ab0dd1161f1aafa345ae Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 10:41:23 +0700 Subject: [PATCH 34/74] fix client project --- local-addons/merctrans_projects/models/merctrans_clients.py | 6 +++++- .../merctrans_projects/models/merctrans_projects.py | 2 +- local-addons/merctrans_projects/views/clients.xml | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 28e3cc4..b56e292 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -16,9 +16,10 @@ class MerctransClient(models.Model): client_note = fields.Html('Client note') phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') - + project_history = fields.Many2many('merctrans.projects', 'client', readonly=True) # client_currency = fields.Many2one('res.currency', # string="Currency",) + @api.constrains('name') def check_duplicate_name(self): for company_rec in self: @@ -33,3 +34,6 @@ def validate_email(self): if match == None: raise ValidationError('Not a valid email') + @api.onchange('name') + def get_project(self): + return {'domain': {'project_history': [('client', '=', self.name)]}} diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 55c0214..d35031e 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -88,7 +88,7 @@ class MercTransProjects(models.Model): f"Project No {self.env['merctrans.projects'].search_count([])}") client = fields.Many2one('merctrans.clients', - string='Clients', + string='Client', required=True, default=lambda self: self.env['merctrans.clients'] .search([('name', '=', 'merctrans')], limit=1)) diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index dad7ce5..a713428 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -28,6 +28,9 @@ + + + From 230e83736a84b52a38145224c65fa06a41aec3eb Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 11:02:10 +0700 Subject: [PATCH 35/74] fix project menu --- .../merctrans_projects/models/merctrans_clients.py | 2 +- .../merctrans_projects/models/merctrans_projects.py | 9 +-------- local-addons/merctrans_projects/views/projects_menus.xml | 4 +--- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index b56e292..1615477 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -16,7 +16,7 @@ class MerctransClient(models.Model): client_note = fields.Html('Client note') phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') - project_history = fields.Many2many('merctrans.projects', 'client', readonly=True) + project_history = fields.Many2many('merctrans.projects', readonly=True, domain="[('client', '=', name)]") # client_currency = fields.Many2one('res.currency', # string="Currency",) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 9640b6f..e104668 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -260,11 +260,4 @@ def sync_status(self): if self.invoice_status == 'invoiced': project.write({'payment_status': 'invoiced'}) - @api.onchange('invoice_client') - def onchange_client_name(self): - res = {} - res['domain'] = {'invoice_detail_ids':[]} - for rec in self: - if rec.invoice_client: - res['domain']['invoice_detail_ids'].append(('invoice_client', '=', rec.invoice_client)) - return res + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 4c78b25..21fd79e 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -143,7 +143,7 @@ - + @@ -205,8 +205,6 @@ - - From 6bfb44ec10753c945c3003e420f06cc8bdfafeb4 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 15:45:56 +0700 Subject: [PATCH 36/74] start docker auto update module --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index fbb4d15..26e02bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,8 @@ services: environment: - USER=odoo - PASSWORD=odoo + command: > + -u merctrans_projects db: image: postgres:13 environment: From cc41957f224f863f71ab21ce83c9a999ac57288c Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 17:17:18 +0700 Subject: [PATCH 37/74] job_value -> project_value DONE --- .../models/merctrans_pos.py | 164 ++++++++++++++++++ .../models/merctrans_projects.py | 19 +- local-addons/merctrans_projects/views/pos.xml | 76 ++++++++ .../views/projects_menus.xml | 6 +- 4 files changed, 253 insertions(+), 12 deletions(-) create mode 100755 local-addons/merctrans_projects/models/merctrans_pos.py create mode 100755 local-addons/merctrans_projects/views/pos.xml diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py new file mode 100755 index 0000000..5a6dfb8 --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -0,0 +1,164 @@ +from odoo.exceptions import ValidationError + +from odoo import api, fields, models + + +class MerctransPOs(models.Model): + _name = 'merctrans.pos' + _description = "Purchase Order by Projects" + _rec_name = "purchase_order" + po_status_list = [('in progress', 'In Progress'), + ('completed', 'Completed'), ('canceled', 'Canceled')] + + work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), + ('job', 'Job')] + + payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), + ('paid', 'Paid')] + # Detail po + + purchase_order = fields.Char('Purchase Order', default='Purchase Order') + pic = fields.Many2one('res.users', 'PIC', required=True) + address = fields.Char('Address', + store=True, + readonly=True, + compute='_get_street_pic') + pic_id = fields.Char('Id', + store=True, + readonly=True, + compute='_get_id_pic') + pic_email = fields.Char('Email', + store=True, + readonly=True, + compute='_get_email_pic') + source_language = fields.Char('Source Language', + store=True, + compute='_get_project_source', + readonly=True) + target_language = fields.Char('Target Language', + readonly=True, + compute='_get_project_target') + currency_id = fields.Many2one('res.currency', string='Currency') + work_unit = fields.Selection(string='Work Unit*', + selection=work_unit_list, + required=True) + volume = fields.Integer(string='Volume*', required=True, default=0) + + sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', + required=True, + default=0) + payment_status = fields.Selection(string='Payment Status', + selection=payment_status_list, + default='Payment Status') + + po_value = fields.Float("Project Value", + compute="_compute_po_value", + store=True, + readonly=True, + default=0) + valid_date = fields.Char('Valid Date', + default="Choose Project", + readonly=True, + compute='_get_project_valid_date') + start_date = fields.Date(string='Start Date') + due_date = fields.Date(string='Due Date') + + # TODO: code = auto gen code unique + + # From Projects? + project_id = fields.Many2one('merctrans.projects', + string="Project", + required=True) + po_status = fields.Selection(string='Status', selection=po_status_list) + service = fields.Many2one('merctrans.services', string='Service') + + # Currency - get from partner Currency + + # TODO: - Cần thêm fields currency cho res.partner + + # TODO: - Cần thêm fields rate cho model -> but? Tính kiểu ? + + # get Source default + + # TODO: Sau khi có currency change street = currency EZ??? + + # Get pic address + @api.onchange('pic') + @api.depends('pic') + def _get_street_pic(self): + self.ensure_one() + print(self.pic.street) + self.address = self.pic.street + + # Get api email + @api.onchange('pic') + @api.depends('pic') + def _get_email_pic(self): + for project in self: + print(project.pic.email) + project.pic_email = project.pic.email + + @api.onchange('pic') + @api.depends('pic') + def _get_id_pic(self): + for project in self: + print(project.pic.id) + project.pic_id = project.pic.id + + @api.onchange('project_id') + @api.depends('project_id') + def _get_project_source(self): + self.source_language = self.project_id.source_language + + @api.onchange('project_id') + @api.depends('project_id') + def _get_project_valid_date(self): + for project in self: + if project.project_id.start_date: + project.valid_date = f"{project.project_id.start_date} >> {project.project_id.due_date}" + else: + project.valid_date = "Choose Project" + + @api.onchange('project_id') + @api.depends('project_id') + def _get_project_target(self): + for project in self: + project.target_language = project.project_id.target_language + + # po start date must greater than project start date + @api.depends('project_id') + @api.constrains('start_date', 'project_id') + def _start_date_contrains(self): + for project in self: + print(project.start_date, project.project_id.start_date) + if project.start_date < project.project_id.start_date: + raise ValidationError( + f'Start date must be greater than project start date: {project.project_id.start_date}' + ) + + # po due date must lesser project due date + @api.depends('project_id') + @api.constrains('due_date', 'project_id') + def _due_date_contrains(self): + for project in self: + print(project.due_date, project.project_id.due_date) + if project.due_date > project.project_id.due_date: + raise ValidationError( + f'Start date must be lesser than project start date: {project.project_id.due_date}' + ) + + @api.constrains('start_date', 'due_date') + def _constraint_date(self): + for project in self: + if project.start_date > project.due_date: + raise ValidationError( + 'Due date must be greater than Start date!') + + # workunit + @api.onchange('volume', 'rate_per_work_unit') + @api.depends('volume', 'sale_rate_per_work_unit') + def _compute_po_value(self): + for project in self: + project.po_value = ( + 100 - + 0) / 100 * project.volume * project.sale_rate_per_work_unit diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 590ad29..5eddcee 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -133,11 +133,11 @@ class MercTransProjects(models.Model): required=True) sale_rate = fields.Float(string='Rate*', required=True, default=0) # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') - job_value = fields.Float("Project Value", - compute="_compute_job_value", - store=True, - readonly=True, - default=0) + project_value = fields.Float("Project Value", + compute="_compute_project_value", + store=True, + readonly=True, + default=0) # NOTE: PROJECT STATUS project_instruction = fields.Html('Project Instruction') @@ -192,10 +192,11 @@ def _get_project_id(self): @api.onchange('volume', 'rate_per_work_unit') @api.depends('volume', 'sale_rate', 'discount') - def _compute_job_value(self): + def _compute_project_value(self): for project in self: - project.job_value = (100 - project.discount - ) / 100 * project.volume * project.sale_rate + project.project_value = ( + 100 - + project.discount) / 100 * project.volume * project.sale_rate @api.constrains('start_date', 'due_date') def date_constrains(self): @@ -231,7 +232,7 @@ class MercTransInvoices(models.Model): @api.depends('invoice_details_ids') def _compute_invoice_value(self): for item in self: - item.invoice_value = sum(line.job_value # x??? rename plz + item.invoice_value = sum(line.project_value # x??? rename plz for line in item.invoice_details_ids) @api.constrains('invoice_details_ids') diff --git a/local-addons/merctrans_projects/views/pos.xml b/local-addons/merctrans_projects/views/pos.xml new file mode 100755 index 0000000..3a3e3a6 --- /dev/null +++ b/local-addons/merctrans_projects/views/pos.xml @@ -0,0 +1,76 @@ + + + + Merctrans Purchase Order List + merctrans.pos + tree,form + + + + + + + Purchase Order Form + merctrans.pos + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + Purchase Order Tree + merctrans.pos + + + + + + + + + + + + + + + + + + + Purchase Search + merctrans.pos + + + + + +
diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 1a11ce5..34bec7e 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -72,7 +72,7 @@ - +
@@ -135,7 +135,7 @@ - +
@@ -205,7 +205,7 @@ - + From 86f6f242a0f407561b6e5f14a9a69b048822fdea Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 17:19:27 +0700 Subject: [PATCH 38/74] delete wrong file --- .../models/merctrans_jobs.py | 3 +- .../models/merctrans_pos.py | 164 ------------------ local-addons/merctrans_projects/views/pos.xml | 76 -------- 3 files changed, 1 insertion(+), 242 deletions(-) delete mode 100755 local-addons/merctrans_projects/models/merctrans_pos.py delete mode 100755 local-addons/merctrans_projects/views/pos.xml diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_jobs.py index 1eb800d..0c01243 100755 --- a/local-addons/merctrans_projects/models/merctrans_jobs.py +++ b/local-addons/merctrans_projects/models/merctrans_jobs.py @@ -58,8 +58,7 @@ class MerctransJobs(models.Model): store=True, readonly=True, default=0) - job_status = fields.Selection(string='JOB STATUS', - selection=job_status_list) + job_status = fields.Selection(string='Status', selection=job_status_list) service = fields.Many2one('merctrans.services', string='Service') # NOTE: INHERIT FROM PROJECT source_language = fields.Char('Source Language', diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py deleted file mode 100755 index 5a6dfb8..0000000 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ /dev/null @@ -1,164 +0,0 @@ -from odoo.exceptions import ValidationError - -from odoo import api, fields, models - - -class MerctransPOs(models.Model): - _name = 'merctrans.pos' - _description = "Purchase Order by Projects" - _rec_name = "purchase_order" - po_status_list = [('in progress', 'In Progress'), - ('completed', 'Completed'), ('canceled', 'Canceled')] - - work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), - ('job', 'Job')] - - payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), - ('paid', 'Paid')] - # Detail po - - purchase_order = fields.Char('Purchase Order', default='Purchase Order') - pic = fields.Many2one('res.users', 'PIC', required=True) - address = fields.Char('Address', - store=True, - readonly=True, - compute='_get_street_pic') - pic_id = fields.Char('Id', - store=True, - readonly=True, - compute='_get_id_pic') - pic_email = fields.Char('Email', - store=True, - readonly=True, - compute='_get_email_pic') - source_language = fields.Char('Source Language', - store=True, - compute='_get_project_source', - readonly=True) - target_language = fields.Char('Target Language', - readonly=True, - compute='_get_project_target') - currency_id = fields.Many2one('res.currency', string='Currency') - work_unit = fields.Selection(string='Work Unit*', - selection=work_unit_list, - required=True) - volume = fields.Integer(string='Volume*', required=True, default=0) - - sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', - required=True, - default=0) - payment_status = fields.Selection(string='Payment Status', - selection=payment_status_list, - default='Payment Status') - - po_value = fields.Float("Project Value", - compute="_compute_po_value", - store=True, - readonly=True, - default=0) - valid_date = fields.Char('Valid Date', - default="Choose Project", - readonly=True, - compute='_get_project_valid_date') - start_date = fields.Date(string='Start Date') - due_date = fields.Date(string='Due Date') - - # TODO: code = auto gen code unique - - # From Projects? - project_id = fields.Many2one('merctrans.projects', - string="Project", - required=True) - po_status = fields.Selection(string='Status', selection=po_status_list) - service = fields.Many2one('merctrans.services', string='Service') - - # Currency - get from partner Currency - - # TODO: - Cần thêm fields currency cho res.partner - - # TODO: - Cần thêm fields rate cho model -> but? Tính kiểu ? - - # get Source default - - # TODO: Sau khi có currency change street = currency EZ??? - - # Get pic address - @api.onchange('pic') - @api.depends('pic') - def _get_street_pic(self): - self.ensure_one() - print(self.pic.street) - self.address = self.pic.street - - # Get api email - @api.onchange('pic') - @api.depends('pic') - def _get_email_pic(self): - for project in self: - print(project.pic.email) - project.pic_email = project.pic.email - - @api.onchange('pic') - @api.depends('pic') - def _get_id_pic(self): - for project in self: - print(project.pic.id) - project.pic_id = project.pic.id - - @api.onchange('project_id') - @api.depends('project_id') - def _get_project_source(self): - self.source_language = self.project_id.source_language - - @api.onchange('project_id') - @api.depends('project_id') - def _get_project_valid_date(self): - for project in self: - if project.project_id.start_date: - project.valid_date = f"{project.project_id.start_date} >> {project.project_id.due_date}" - else: - project.valid_date = "Choose Project" - - @api.onchange('project_id') - @api.depends('project_id') - def _get_project_target(self): - for project in self: - project.target_language = project.project_id.target_language - - # po start date must greater than project start date - @api.depends('project_id') - @api.constrains('start_date', 'project_id') - def _start_date_contrains(self): - for project in self: - print(project.start_date, project.project_id.start_date) - if project.start_date < project.project_id.start_date: - raise ValidationError( - f'Start date must be greater than project start date: {project.project_id.start_date}' - ) - - # po due date must lesser project due date - @api.depends('project_id') - @api.constrains('due_date', 'project_id') - def _due_date_contrains(self): - for project in self: - print(project.due_date, project.project_id.due_date) - if project.due_date > project.project_id.due_date: - raise ValidationError( - f'Start date must be lesser than project start date: {project.project_id.due_date}' - ) - - @api.constrains('start_date', 'due_date') - def _constraint_date(self): - for project in self: - if project.start_date > project.due_date: - raise ValidationError( - 'Due date must be greater than Start date!') - - # workunit - @api.onchange('volume', 'rate_per_work_unit') - @api.depends('volume', 'sale_rate_per_work_unit') - def _compute_po_value(self): - for project in self: - project.po_value = ( - 100 - - 0) / 100 * project.volume * project.sale_rate_per_work_unit diff --git a/local-addons/merctrans_projects/views/pos.xml b/local-addons/merctrans_projects/views/pos.xml deleted file mode 100755 index 3a3e3a6..0000000 --- a/local-addons/merctrans_projects/views/pos.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - Merctrans Purchase Order List - merctrans.pos - tree,form - - - - - - - Purchase Order Form - merctrans.pos - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - - Purchase Order Tree - merctrans.pos - - - - - - - - - - - - - - - - - - - Purchase Search - merctrans.pos - - - - - -
From f666387479bfcfce5ec86bd581e182e9310262ea Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 17:20:54 +0700 Subject: [PATCH 39/74] rename file --- local-addons/merctrans_projects/__manifest__.py | 2 +- local-addons/merctrans_projects/models/__init__.py | 2 +- .../models/{merctrans_jobs.py => merctrans_pos.py} | 0 local-addons/merctrans_projects/views/{jobs.xml => pos.xml} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename local-addons/merctrans_projects/models/{merctrans_jobs.py => merctrans_pos.py} (100%) rename local-addons/merctrans_projects/views/{jobs.xml => pos.xml} (100%) diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index 0714d12..ef0c9be 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -34,7 +34,7 @@ 'security/security_rules.xml', 'security/ir.model.access.csv', # View <> - 'views/jobs.xml', + 'views/pos.xml', 'views/clients.xml', 'views/projects_menus.xml', 'views/templates.xml', diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py index 69c8e65..5ccf449 100755 --- a/local-addons/merctrans_projects/models/__init__.py +++ b/local-addons/merctrans_projects/models/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # from . import merctrans_sales -from . import merctrans_clients, merctrans_jobs, merctrans_projects +from . import merctrans_clients, merctrans_pos, merctrans_projects diff --git a/local-addons/merctrans_projects/models/merctrans_jobs.py b/local-addons/merctrans_projects/models/merctrans_pos.py similarity index 100% rename from local-addons/merctrans_projects/models/merctrans_jobs.py rename to local-addons/merctrans_projects/models/merctrans_pos.py diff --git a/local-addons/merctrans_projects/views/jobs.xml b/local-addons/merctrans_projects/views/pos.xml similarity index 100% rename from local-addons/merctrans_projects/views/jobs.xml rename to local-addons/merctrans_projects/views/pos.xml From 8157d774f7b42366627ae33b8ac12191fff17914 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 17:34:22 +0700 Subject: [PATCH 40/74] jobs >> po, pos, purchase order --- .../models/merctrans_pos.py | 32 ++++++++--------- .../models/merctrans_projects.py | 7 ++-- .../security/ir.model.access.csv | 4 +-- .../security/security_rules.xml | 6 ++-- .../merctrans_projects/views/__manifest__.py | 2 +- local-addons/merctrans_projects/views/pos.xml | 35 +++++++++---------- .../views/projects_menus.xml | 26 +++++++------- 7 files changed, 55 insertions(+), 57 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 0c01243..088c949 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -3,25 +3,25 @@ from odoo import api, fields, models -class MerctransJobs(models.Model): +class MerctransPOs(models.Model): """ Khoi tao model """ - _name = 'merctrans.jobs' - _description = "Jobs by Projects" + _name = 'merctrans.pos' + _description = "Purchase Order by Projects" _rec_name = "purchase_order" """ Static List """ - job_status_list = [('in progress', 'In Progress'), - ('completed', 'Completed'), ('canceled', 'Canceled')] + po_status_list = [('in progress', 'In Progress'), + ('completed', 'Completed'), ('canceled', 'Canceled')] work_unit_list = [('word', 'Word'), ('hour', 'Hour'), ('page', 'Page'), ('job', 'Job')] payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] - # Detail Job + # Detail po """ Field and API Decorate """ @@ -53,12 +53,12 @@ class MerctransJobs(models.Model): selection=payment_status_list, default='Payment Status') - job_value = fields.Float("Project Value", - compute="_compute_job_value", - store=True, - readonly=True, - default=0) - job_status = fields.Selection(string='Status', selection=job_status_list) + po_value = fields.Float("Project Value", + compute="_compute_po_value", + store=True, + readonly=True, + default=0) + po_status = fields.Selection(string='Status', selection=po_status_list) service = fields.Many2one('merctrans.services', string='Service') # NOTE: INHERIT FROM PROJECT source_language = fields.Char('Source Language', @@ -143,7 +143,7 @@ def _get_project_target(self): for project in self: project.target_language = project.project_id.target_language - # Job start date must greater than project start date + # po start date must greater than project start date @api.depends('project_id') @api.constrains('start_date', 'project_id') def _start_date_contrains(self): @@ -153,7 +153,7 @@ def _start_date_contrains(self): f'Start date must be greater than project start date: {project.project_id.start_date}' ) - # Job due date must lesser project due date + # po due date must lesser project due date @api.depends('project_id') @api.constrains('due_date', 'project_id') def _due_date_contrains(self): @@ -174,8 +174,8 @@ def _constraint_date(self): # workunit @api.onchange('volume', 'rate_per_work_unit') @api.depends('volume', 'sale_rate_per_work_unit') - def _compute_job_value(self): + def _compute_po_value(self): for project in self: - project.job_value = ( + project.po_value = ( 100 - 0) / 100 * project.volume * project.sale_rate_per_work_unit diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 5eddcee..4924cec 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -149,9 +149,9 @@ class MercTransProjects(models.Model): selection=payment_status_list, default='Payment Status') - job_details = fields.One2many("merctrans.jobs", - "project_id", - string="Jobs in this Project") + po_details = fields.One2many("merctrans.pos", + "project_id", + string="Purchase Order in this Project") def _get_client_name(self): self.client_name = '' @@ -225,7 +225,6 @@ class MercTransInvoices(models.Model): currency_id = fields.Many2one('res.currency', string='Currency') invoice_value = fields.Float("Invoice Value", compute="_compute_invoice_value") - # invoice_details_ids = fields.Many2many('merctrans.invoices.lines', 'job_id', string="Invoice Lines") invoice_status = fields.Selection(string="Invoice Status", selection=status_list) diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv index 8734511..6d05cd5 100755 --- a/local-addons/merctrans_projects/security/ir.model.access.csv +++ b/local-addons/merctrans_projects/security/ir.model.access.csv @@ -2,6 +2,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink acl_project,merctransproject.project_default,model_merctrans_projects,group_merctrans_pm,1,1,1,1 acl_pm_services,merctransproject.service_default,model_merctrans_services,group_merctrans_pm,1,1,1,1 acl_pm_invoices,merctransproject.invoices_default,model_merctrans_invoices,group_merctrans_pm,1,1,1,1 -acl_pm_jobs,merctransproject.jobs_default,model_merctrans_jobs,group_merctrans_pm,1,1,1,1 +acl_pm_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_pm,1,1,1,1 acl_pm_clients,merctransproject.clients_default,model_merctrans_clients,group_merctrans_pm,1,1,1,1 -acl_contributor_jobs,merctransproject.jobs_default,model_merctrans_jobs,group_merctrans_contributor,1,0,0,0 +acl_contributor_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_contributor,1,0,0,0 diff --git a/local-addons/merctrans_projects/security/security_rules.xml b/local-addons/merctrans_projects/security/security_rules.xml index 0b2e284..a3bc09b 100755 --- a/local-addons/merctrans_projects/security/security_rules.xml +++ b/local-addons/merctrans_projects/security/security_rules.xml @@ -1,8 +1,8 @@ - - Merctrans Job: see only user job - + + Merctrans Purchase Order: see only user PO + [('contributor_id','=',user.id)] diff --git a/local-addons/merctrans_projects/views/__manifest__.py b/local-addons/merctrans_projects/views/__manifest__.py index 9df6e38..0c2917f 100755 --- a/local-addons/merctrans_projects/views/__manifest__.py +++ b/local-addons/merctrans_projects/views/__manifest__.py @@ -33,7 +33,7 @@ 'views/projects_menus.xml', 'views/templates.xml', 'views/sale.xml', - 'views/jobs.xml' + 'views/po.xml' ], # only loaded in demonstration mode 'demo': [ diff --git a/local-addons/merctrans_projects/views/pos.xml b/local-addons/merctrans_projects/views/pos.xml index e2f220f..7ace37d 100755 --- a/local-addons/merctrans_projects/views/pos.xml +++ b/local-addons/merctrans_projects/views/pos.xml @@ -1,24 +1,23 @@ - - Merctrans Job List - merctrans.jobs + + Merctrans Purhchase Order List + merctrans.pos tree,form - - - - Job Form - merctrans.jobs + + + Purchase Order Form + merctrans.pos
- + @@ -34,7 +33,7 @@ - + @@ -44,16 +43,16 @@ - - - Job Tree - merctrans.jobs + + + Purchase Order Tree + merctrans.pos - + @@ -65,9 +64,9 @@ - - Job Search - merctrans.jobs + + Purchase Order Search + merctrans.pos diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 34bec7e..faf74db 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -26,7 +26,7 @@ - + @@ -141,8 +141,8 @@ - - + + @@ -215,17 +215,17 @@ - - - Job Form - merctrans.jobs + + + Purchase Order Form + merctrans.pos - + @@ -243,16 +243,16 @@ - - - Job Tree - merctrans.jobs + + + Purchase Order Tree + merctrans.pos - + From 1cef357aaca0ba5ffdbf0c2893168bd5ad69f08a Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 14 Jul 2022 17:52:36 +0700 Subject: [PATCH 41/74] change layout of pos --- .../models/merctrans_pos.py | 4 +-- .../views/projects_menus.xml | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 088c949..a8ca983 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -62,17 +62,14 @@ class MerctransPOs(models.Model): service = fields.Many2one('merctrans.services', string='Service') # NOTE: INHERIT FROM PROJECT source_language = fields.Char('Source Language', - default="English", store=True, compute='_get_project_source', readonly=True) target_language = fields.Char('Target Language', - default="Vietnamess", readonly=True, compute='_get_project_target') currency_id = fields.Many2one('res.currency', string='Currency') valid_date = fields.Char('Valid Date', - default="Choose Project", readonly=True, compute='_get_project_valid_date') start_date = fields.Date( @@ -136,6 +133,7 @@ def _get_project_valid_date(self): project.valid_date = f"{project.project_id.start_date} >> {project.project_id.due_date}" else: project.valid_date = "Choose Project" + return project.valid_date @api.onchange('project_id') @api.depends('project_id') diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index faf74db..e5f1a39 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -123,10 +123,10 @@ + - @@ -143,34 +143,36 @@ - + - - - - + + + - - + + + + + - - - + + + @@ -195,7 +197,6 @@ - @@ -205,10 +206,12 @@ + + From 1e7dc12363902803762cdf58376da14d45d50ca7 Mon Sep 17 00:00:00 2001 From: truong tang Date: Thu, 14 Jul 2022 12:13:21 +0700 Subject: [PATCH 42/74] add client history and client invoice history --- .../merctrans_projects/models/merctrans_clients.py | 7 +++---- local-addons/merctrans_projects/models/merctrans_pos.py | 6 +++--- .../merctrans_projects/models/merctrans_projects.py | 4 ++-- local-addons/merctrans_projects/views/clients.xml | 9 +++++++++ local-addons/merctrans_projects/views/projects_menus.xml | 2 -- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 1615477..24a6fd0 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -16,7 +16,8 @@ class MerctransClient(models.Model): client_note = fields.Html('Client note') phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') - project_history = fields.Many2many('merctrans.projects', readonly=True, domain="[('client', '=', name)]") + project_history = fields.One2many('merctrans.projects', 'client', readonly=True) + invoice_history = fields.One2many('merctrans.invoices', 'invoice_client') # client_currency = fields.Many2one('res.currency', # string="Currency",) @@ -34,6 +35,4 @@ def validate_email(self): if match == None: raise ValidationError('Not a valid email') - @api.onchange('name') - def get_project(self): - return {'domain': {'project_history': [('client', '=', self.name)]}} + diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index a8ca983..cb0a1f1 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -46,19 +46,19 @@ class MerctransPOs(models.Model): required=True) volume = fields.Integer(string='Volume*', required=True, default=0) - sale_rate_per_work_unit = fields.Float(string='Sale rate per Work Unit', + sale_rate_per_work_unit = fields.Float(string='Rate*', required=True, default=0) payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, - default='Payment Status') + default='unpaid') po_value = fields.Float("Project Value", compute="_compute_po_value", store=True, readonly=True, default=0) - po_status = fields.Selection(string='Status', selection=po_status_list) + po_status = fields.Selection(string='Status', selection=po_status_list, default='Unpaid') service = fields.Many2one('merctrans.services', string='Service') # NOTE: INHERIT FROM PROJECT source_language = fields.Char('Source Language', diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index e104668..f4f4fdc 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -233,8 +233,8 @@ def _compute_invoice_value(self): for item in self: item.invoice_value = sum(line.project_value # x??? rename plz for line in item.invoice_details_ids) - - @api.constrains('invoice_details_ids') + # @api.depends('currency_id') + @api.constrains('invoice_details_ids', 'currency_id') def currency_constrains(self): for job in self: for x in job.invoice_details_ids: diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index a713428..5c146fa 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -31,6 +31,15 @@ + + + + + + + + + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index d241506..f92afc7 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -205,8 +205,6 @@ - - From 64a8a44e0bea77a56b60a60781a085f76244ff51 Mon Sep 17 00:00:00 2001 From: truong tang Date: Fri, 15 Jul 2022 01:56:23 +0700 Subject: [PATCH 43/74] add client project history and invoice history --- local-addons/merctrans_projects/models/merctrans_clients.py | 2 +- local-addons/merctrans_projects/views/clients.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 24a6fd0..ee59e8a 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -17,7 +17,7 @@ class MerctransClient(models.Model): phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') project_history = fields.One2many('merctrans.projects', 'client', readonly=True) - invoice_history = fields.One2many('merctrans.invoices', 'invoice_client') + invoice_history = fields.One2many('merctrans.invoices', 'invoice_client',domain=[('invoice_status', '=', 'unpaid')]) # client_currency = fields.Many2one('res.currency', # string="Currency",) diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 5c146fa..9f51cb0 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -32,7 +32,7 @@ - + From ddd95d757bca5f26cac0f33301d596a1451881ec Mon Sep 17 00:00:00 2001 From: truong tang Date: Fri, 15 Jul 2022 03:33:56 +0700 Subject: [PATCH 44/74] add margin to project, fix required fields in projects, fix display fields for PO --- .../models/merctrans_clients.py | 2 +- .../models/merctrans_pos.py | 2 +- .../models/merctrans_projects.py | 42 ++++++++++++++----- .../merctrans_projects/views/clients.xml | 3 -- .../views/projects_menus.xml | 12 ++++-- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index ee59e8a..436f8f2 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -17,7 +17,7 @@ class MerctransClient(models.Model): phone_number = fields.Char(string='Phone number') website = fields.Char(string='Website') project_history = fields.One2many('merctrans.projects', 'client', readonly=True) - invoice_history = fields.One2many('merctrans.invoices', 'invoice_client',domain=[('invoice_status', '=', 'unpaid')]) + invoice_history = fields.One2many('merctrans.invoices', 'invoice_client', domain=[('invoice_status', '=', 'unpaid')]) # client_currency = fields.Many2one('res.currency', # string="Currency",) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index cb0a1f1..08e695d 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -58,7 +58,7 @@ class MerctransPOs(models.Model): store=True, readonly=True, default=0) - po_status = fields.Selection(string='Status', selection=po_status_list, default='Unpaid') + po_status = fields.Selection(string='Status', selection=po_status_list, default='in progress') service = fields.Many2one('merctrans.services', string='Service') # NOTE: INHERIT FROM PROJECT source_language = fields.Char('Source Language', diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index f4f4fdc..511aa4c 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -83,12 +83,12 @@ class MercTransProjects(models.Model): compute="_get_project_id") project_name = fields.Char( - 'Project Name', + 'Project Name*', default=lambda self: f"Project No {self.env['merctrans.projects'].search_count([])}") client = fields.Many2one('merctrans.clients', - string='Client', + string='Client*', required=True, default=lambda self: self.env['merctrans.clients'] .search([('name', '=', 'merctrans')], limit=1)) @@ -118,9 +118,9 @@ class MercTransProjects(models.Model): start_date = fields.Date(string='Start Date*', required=True) due_date = fields.Date(string='Due Date*', required=True) - # NOTE: SALE, Volume, unit, rate + # NOTE: SALE, Volume, unit, rate, margin - discount = fields.Integer(string='Discount (%)', default=0) + discount = fields.Integer(string='Discount', default=0) # add discount field # fixed job @@ -132,26 +132,35 @@ class MercTransProjects(models.Model): string='Currency*', required=True) sale_rate = fields.Float(string='Rate*', required=True, default=0) - # production_rate_per_work_unit = fields.Float('Production rate per Work Unit') project_value = fields.Float("Project Value", compute="_compute_project_value", store=True, readonly=True, default=0) + total_po_value = fields.Float("Total PO value", + compute="_compute_po_value", + store=True, + readonly=True, + default=0) + project_margin = fields.Float("Project Margin", + compute="_compute_margin", + store=True, + readonly=True, + default=0) # NOTE: PROJECT STATUS project_instruction = fields.Html('Project Instruction') project_status = fields.Selection(string='Project Status', selection=project_status_list, required=True, - default='Project Status') + default='in progress') payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, - default='Payment Status') + default='unpaid') po_details = fields.One2many("merctrans.pos", "project_id", - string="Purchase Order in this Project") + string="Purchase Orders in this Project") def _get_client_name(self): self.client_name = '' @@ -205,6 +214,19 @@ def date_constrains(self): raise ValidationError( 'Due date must be greater than Start date!') + @api.depends('po_details') + def _compute_po_value(self): + for job in self: + job.total_po_value = sum(po.po_value for po in job.po_details) + + @api.onchange('project_value', 'total_po_value') + @api.depends('project_value', 'total_po_value') + def _compute_margin(self): + for project in self: + if project.project_value > 0: + project.project_margin = (project.project_value - project.total_po_value) / project.project_value + + class MercTransInvoices(models.Model): _name = 'merctrans.invoices' @@ -226,14 +248,14 @@ class MercTransInvoices(models.Model): invoice_value = fields.Float("Invoice Value", compute="_compute_invoice_value") invoice_status = fields.Selection(string="Invoice Status", - selection=status_list) + selection=status_list, default='Unpaid') @api.depends('invoice_details_ids') def _compute_invoice_value(self): for item in self: item.invoice_value = sum(line.project_value # x??? rename plz for line in item.invoice_details_ids) - # @api.depends('currency_id') + @api.constrains('invoice_details_ids', 'currency_id') def currency_constrains(self): for job in self: diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 9f51cb0..e9e6ec1 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -18,9 +18,6 @@ - - -
diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index f92afc7..da8f60b 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -127,15 +127,17 @@ + - - + + + @@ -152,6 +154,7 @@ +
@@ -171,6 +174,7 @@ + @@ -204,11 +208,11 @@ - - + + From 2f3b3f2af79eaaa4ab6878a5fdef54b83ec82c94 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 15 Jul 2022 17:59:19 +0700 Subject: [PATCH 45/74] add blank line --- .../models/merctrans_clients.py | 30 +++++++++++--- .../models/merctrans_pos.py | 22 ++++++++-- .../models/merctrans_projects.py | 41 ++++++++++++++----- 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 436f8f2..c889349 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -4,35 +4,53 @@ class MerctransClient(models.Model): + _name = 'merctrans.clients' + _rec_name = 'name' + _description = "Merctrans's Clients" # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') name = fields.Char(string='Client') + email = fields.Char(string='Email') + country = fields.Many2one('res.country', string='Country') + client_note = fields.Html('Client note') + phone_number = fields.Char(string='Phone number') + website = fields.Char(string='Website') - project_history = fields.One2many('merctrans.projects', 'client', readonly=True) - invoice_history = fields.One2many('merctrans.invoices', 'invoice_client', domain=[('invoice_status', '=', 'unpaid')]) + + project_history = fields.One2many('merctrans.projects', + 'client', + readonly=True) + + invoice_history = fields.One2many('merctrans.invoices', + 'invoice_client', + domain=[('invoice_status', '=', 'unpaid') + ]) + # client_currency = fields.Many2one('res.currency', # string="Currency",) @api.constrains('name') def check_duplicate_name(self): for company_rec in self: - company_rec = self.env['merctrans.clients'].search([('name', '=', self.name), ('id', '!=', self.id)]) + company_rec = self.env['merctrans.clients'].search([ + ('name', '=', self.name), ('id', '!=', self.id) + ]) if company_rec: raise ValidationError('Company name cannot be duplicated!') @api.constrains('email') def validate_email(self): if self.email: - match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', self.email) + match = re.match( + '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', + self.email) if match == None: raise ValidationError('Not a valid email') - - diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 08e695d..f00facc 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -26,16 +26,21 @@ class MerctransPOs(models.Model): Field and API Decorate """ # NOTE: NON-inherit from project page + purchase_order = fields.Char('Purchase Order', default='Purchase Order') + contributor = fields.Many2one('res.users', 'Contributor', required=True) + address = fields.Char('Address', store=True, readonly=True, compute='_get_street_contributor') + contributor_id = fields.Char('Id', store=True, readonly=True, compute='_get_id_contributor') + contributor_email = fields.Char('Email', store=True, readonly=True, @@ -44,11 +49,13 @@ class MerctransPOs(models.Model): work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, required=True) + volume = fields.Integer(string='Volume*', required=True, default=0) sale_rate_per_work_unit = fields.Float(string='Rate*', required=True, default=0) + payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, default='unpaid') @@ -58,25 +65,34 @@ class MerctransPOs(models.Model): store=True, readonly=True, default=0) - po_status = fields.Selection(string='Status', selection=po_status_list, default='in progress') + + po_status = fields.Selection(string='Status', + selection=po_status_list, + default='in progress') + service = fields.Many2one('merctrans.services', string='Service') + # NOTE: INHERIT FROM PROJECT + source_language = fields.Char('Source Language', store=True, compute='_get_project_source', readonly=True) + target_language = fields.Char('Target Language', readonly=True, compute='_get_project_target') + currency_id = fields.Many2one('res.currency', string='Currency') + valid_date = fields.Char('Valid Date', readonly=True, compute='_get_project_valid_date') + start_date = fields.Date( string='Start Date') #, default="_get_start_date") - due_date = fields.Date(string='Due Date') #, default="_get_due_date") - # TODO: code = auto gen code unique + due_date = fields.Date(string='Due Date') #, default="_get_due_date") # From Projects? project_id = fields.Many2one('merctrans.projects', diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 511aa4c..e280087 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -37,6 +37,7 @@ class MercTransProjects(models.Model): """ Static list """ + # NOTE: STATIC LIST language_list = [('zh-CN', 'Chinese (Simplified)'), ('zh-TW', 'Chinese (Traditional)'), @@ -72,11 +73,13 @@ class MercTransProjects(models.Model): để thuận tiện hơn trong chỉnh sửa và debug """ - # NOTE: ID and Project ID, project name, client, tags + # NOTE: ID AND PROJECT ID, PROJECT NAME, CLIENT, TAGS + number_id = fields.Integer('No number', index=True, readonly=True, copy=False) + project_id = fields.Char('Project Id', default="new_project", readonly=True, @@ -94,31 +97,37 @@ class MercTransProjects(models.Model): .search([('name', '=', 'merctrans')], limit=1)) services_ids = fields.Many2many('merctrans.services', string='Services') + client_name = fields.Char('Client_', compute='_get_client_name', default='merctrans', readonly=True) + tags = fields.Many2many('merctrans.tags', string='Tags') project_manager = fields.Many2one('res.users', string='Project Manager*', required=True) - # compute project_id by client many 2 one -> should default value client_name - # services contain tags - # NOTE: Target and Source Language + + # NOTE: TARGET AND SOURCE LANGUAGE + source_language = fields.Selection(string="Source Languages", selection=language_list, default="Select a language") + target_language = fields.Selection(string="Target Language", selection=language_list, default="Select a language") - # NOTE: TIME, START and DUE DATE + # NOTE: TIME, START AND DUE DATE + current_time = datetime.now().strftime("%Y%m%d-%H%M%s") + start_date = fields.Date(string='Start Date*', required=True) + due_date = fields.Date(string='Due Date*', required=True) - # NOTE: SALE, Volume, unit, rate, margin + # NOTE: SALE, VOLUME, UNIT, RATE, MARGIN discount = fields.Integer(string='Discount', default=0) # add discount field @@ -128,32 +137,40 @@ class MercTransProjects(models.Model): selection=work_unit_list, required=True) volume = fields.Integer(string='Volume*', required=True, default=0) + currency_id = fields.Many2one('res.currency', string='Currency*', required=True) + sale_rate = fields.Float(string='Rate*', required=True, default=0) + project_value = fields.Float("Project Value", compute="_compute_project_value", store=True, readonly=True, default=0) + total_po_value = fields.Float("Total PO value", compute="_compute_po_value", store=True, readonly=True, default=0) + project_margin = fields.Float("Project Margin", compute="_compute_margin", store=True, readonly=True, default=0) + # NOTE: PROJECT STATUS project_instruction = fields.Html('Project Instruction') + project_status = fields.Selection(string='Project Status', selection=project_status_list, required=True, default='in progress') + payment_status = fields.Selection(string='Payment Status', selection=payment_status_list, default='unpaid') @@ -162,6 +179,8 @@ class MercTransProjects(models.Model): "project_id", string="Purchase Orders in this Project") + # NOTE: FUNCTION AND API DECORATE + def _get_client_name(self): self.client_name = '' for record in self: @@ -224,8 +243,9 @@ def _compute_po_value(self): def _compute_margin(self): for project in self: if project.project_value > 0: - project.project_margin = (project.project_value - project.total_po_value) / project.project_value - + project.project_margin = ( + project.project_value - + project.total_po_value) / project.project_value class MercTransInvoices(models.Model): @@ -248,7 +268,8 @@ class MercTransInvoices(models.Model): invoice_value = fields.Float("Invoice Value", compute="_compute_invoice_value") invoice_status = fields.Selection(string="Invoice Status", - selection=status_list, default='Unpaid') + selection=status_list, + default='Unpaid') @api.depends('invoice_details_ids') def _compute_invoice_value(self): @@ -281,5 +302,3 @@ def sync_status(self): project.write({'payment_status': 'paid'}) if self.invoice_status == 'invoiced': project.write({'payment_status': 'invoiced'}) - - From cb483b97e90139eeb7315a01afb5a186e3a09894 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 20 Jul 2022 09:54:42 +0700 Subject: [PATCH 46/74] updated readme bash and postgres --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index a956220..08980b4 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ # Merctrans Project Manager +- debug docker odoo +``` bash +docker exec -it 02_merctrans_odoo-web_prod-1 bash -c "odoo shell -d merctrans" +``` +- docker exec -it 02_merctrans_odoo-web_prod-1 bash -c "odoo shell -d merctrans" +- Connect Postgres in docker +``` bash +# name_service_db = 02_merctrans_odoo-db-1 +docker exec -it 02_merctrans_odoo-db-1 bash +# Sau khi connect duoc vao bash cua odoo service +psql -U odoo postgres +``` From 8e0be55a3e2140c659464ddfcdcb2f53022a2f09 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 20 Jul 2022 12:47:24 +0700 Subject: [PATCH 47/74] add service pgadmin4 --- README.md | 6 +++++ docker-compose.yml | 24 +++++++++++++++++++ .../models/merctrans_pos.py | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08980b4..7e64fe6 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,9 @@ docker exec -it 02_merctrans_odoo-db-1 bash # Sau khi connect duoc vao bash cua odoo service psql -U odoo postgres ``` + +connect pgadmin4 - port 5433 +**Create new server** +hostname/address : db +username: odoo +password: odoo diff --git a/docker-compose.yml b/docker-compose.yml index 26e02bf..5aaca81 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,8 @@ services: environment: - USER=odoo - PASSWORD=odoo + networks: + - postgres command: > -u merctrans_projects db: @@ -24,10 +26,32 @@ services: - PGDATA=/var/lib/postgresql/data/pgdata volumes: - odoo-db-data:/var/lib/postgresql/data/pgdata + networks: + - postgres + pgadmin: + container_name: pgadmin_container + image: dpage/pgadmin4 + environment: + PGADMIN_DEFAULT_EMAIL: amdin@merctrans.vn + PGADMIN_DEFAULT_PASSWORD: admin + PGADMIN_CONFIG_SERVER_MODE: 'False' + volumes: + - pgadmin:/var/lib/pgadmin + + ports: + - 5433:80 + networks: + - postgres + restart: unless-stopped + +networks: + postgres: + driver: bridge volumes: odoo-web-data: odoo-db-data: + pgadmin: diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index f00facc..21ebcf9 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -92,7 +92,7 @@ class MerctransPOs(models.Model): start_date = fields.Date( string='Start Date') #, default="_get_start_date") - due_date = fields.Date(string='Due Date') #, default="_get_due_date") + due_date = fields.Date(string='Due Date') # default="_get_due_date") # From Projects? project_id = fields.Many2one('merctrans.projects', From 59be719180d08ff6f70e5da1420eebc9a445808e Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 21 Jul 2022 11:28:19 +0700 Subject: [PATCH 48/74] PO ID Done --- .../models/merctrans_pos.py | 20 ++++++++++++++++++- .../views/projects_menus.xml | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 21ebcf9..38646a7 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -27,7 +27,10 @@ class MerctransPOs(models.Model): """ # NOTE: NON-inherit from project page - purchase_order = fields.Char('Purchase Order', default='Purchase Order') + purchase_order = fields.Char('Purchase Order', + store=True, + readonly=True, + compute="_get_purchase_order") contributor = fields.Many2one('res.users', 'Contributor', required=True) @@ -100,6 +103,21 @@ class MerctransPOs(models.Model): store=True) # Get contributor address + @api.onchange('project_id', 'contributor') + @api.depends('project_id', 'contributor') + def _get_purchase_order(self): + for po in self: + if po.project_id: + pj = po.project_id.project_id.split("-") + ctrb = po.contributor.name if po.contributor else "ctrb" + # ids = self.env['merctrans.pos'].sudo().search_count([ + # ('project_id', "=", po.project_id.id) + # ]) + ids = len(po.project_id.po_details) + po.purchase_order = f"PO{ids}-{ctrb[:3].upper()}|{pj[0]}{pj[1][2:]}" + else: + po.purchase_order = "Select Project" + @api.onchange('contributor') @api.depends('contributor') def _get_street_contributor(self): diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index da8f60b..1b2697c 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -122,8 +122,8 @@ - + From c6fbe583a57a4cfe6580dd91482f9c43698bab19 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Thu, 21 Jul 2022 12:08:06 +0700 Subject: [PATCH 49/74] default date --- .../merctrans_projects/models/merctrans_pos.py | 15 ++++++++++++--- .../models/merctrans_projects.py | 8 ++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 38646a7..9973ee7 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -92,16 +92,25 @@ class MerctransPOs(models.Model): readonly=True, compute='_get_project_valid_date') - start_date = fields.Date( - string='Start Date') #, default="_get_start_date") + start_date = fields.Date(string='Start Date', default=fields.Date.today()) - due_date = fields.Date(string='Due Date') # default="_get_due_date") + due_date = fields.Date(string='Due Date', + default=lambda self: self._get_default_date()) # From Projects? project_id = fields.Many2one('merctrans.projects', string="Project", store=True) + @api.model + def _get_default_date(self): + for p in self: + if p.project_id: + p.due_date = p.project_id.due_date + return p.project_id.due_date + else: + return fields.Date.today() + # Get contributor address @api.onchange('project_id', 'contributor') @api.depends('project_id', 'contributor') diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index e280087..e4a1fbe 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -123,9 +123,13 @@ class MercTransProjects(models.Model): current_time = datetime.now().strftime("%Y%m%d-%H%M%s") - start_date = fields.Date(string='Start Date*', required=True) + start_date = fields.Date(string='Start Date*', + required=True, + default=fields.Date.today()) - due_date = fields.Date(string='Due Date*', required=True) + due_date = fields.Date(string='Due Date*', + required=True, + default=fields.Datetime.today()) # NOTE: SALE, VOLUME, UNIT, RATE, MARGIN From 75dfbb675983935c6b2560d2d21eda4ffb7ee8ec Mon Sep 17 00:00:00 2001 From: svseas Date: Thu, 21 Jul 2022 19:20:15 +0700 Subject: [PATCH 50/74] fix view --- local-addons/merctrans_projects/views/projects_menus.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 1b2697c..d7385e7 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -122,9 +122,9 @@ - + From 57d210bce38d20b11a81d4f0ff26c5f67bed2e9a Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 11:02:23 +0700 Subject: [PATCH 51/74] change required, name some fields in pos --- .../models/merctrans_pos.py | 36 +++++++++---------- .../views/projects_menus.xml | 6 ++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 9973ee7..1104aed 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -32,7 +32,7 @@ class MerctransPOs(models.Model): readonly=True, compute="_get_purchase_order") - contributor = fields.Many2one('res.users', 'Contributor', required=True) + contributor = fields.Many2one('res.users', 'Contributor*', required=True) address = fields.Char('Address', store=True, @@ -51,6 +51,7 @@ class MerctransPOs(models.Model): work_unit = fields.Selection(string='Work Unit*', selection=work_unit_list, + default="hour", required=True) volume = fields.Integer(string='Volume*', required=True, default=0) @@ -59,18 +60,20 @@ class MerctransPOs(models.Model): required=True, default=0) - payment_status = fields.Selection(string='Payment Status', + payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, + required=True, default='unpaid') - po_value = fields.Float("Project Value", + po_value = fields.Float("Value", compute="_compute_po_value", store=True, readonly=True, default=0) - po_status = fields.Selection(string='Status', + po_status = fields.Selection(string='Status*', selection=po_status_list, + required=True, default='in progress') service = fields.Many2one('merctrans.services', string='Service') @@ -92,25 +95,21 @@ class MerctransPOs(models.Model): readonly=True, compute='_get_project_valid_date') - start_date = fields.Date(string='Start Date', default=fields.Date.today()) + start_date = fields.Date(string='Start Date*', + required=True, + default=fields.Date.today()) - due_date = fields.Date(string='Due Date', - default=lambda self: self._get_default_date()) + due_date = fields.Date( + string='Due Date*', + required=True, + default=lambda self: self.env['merctrans.projects'].search([( + 'project_id', '=', 'project_id.project_id')]).due_date) # From Projects? project_id = fields.Many2one('merctrans.projects', string="Project", store=True) - @api.model - def _get_default_date(self): - for p in self: - if p.project_id: - p.due_date = p.project_id.due_date - return p.project_id.due_date - else: - return fields.Date.today() - # Get contributor address @api.onchange('project_id', 'contributor') @api.depends('project_id', 'contributor') @@ -119,9 +118,6 @@ def _get_purchase_order(self): if po.project_id: pj = po.project_id.project_id.split("-") ctrb = po.contributor.name if po.contributor else "ctrb" - # ids = self.env['merctrans.pos'].sudo().search_count([ - # ('project_id', "=", po.project_id.id) - # ]) ids = len(po.project_id.po_details) po.purchase_order = f"PO{ids}-{ctrb[:3].upper()}|{pj[0]}{pj[1][2:]}" else: @@ -213,7 +209,7 @@ def _constraint_date(self): 'Due date must be greater than Start date!') # workunit - @api.onchange('volume', 'rate_per_work_unit') + @api.onchange('volume', 'sale_rate_per_work_unit') @api.depends('volume', 'sale_rate_per_work_unit') def _compute_po_value(self): for project in self: diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 1b2697c..e5bf9ea 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -152,7 +152,7 @@ - + @@ -167,8 +167,8 @@ - - + + From 3aa24577fd176f8234f9c8626f110311b08200a4 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 11:52:02 +0700 Subject: [PATCH 52/74] invoice id done --- .../merctrans_projects/models/__init__.py | 2 +- .../models/merctrans_invoices.py | 77 +++++++++++++++++++ .../models/merctrans_pos.py | 4 +- .../models/merctrans_projects.py | 67 ++-------------- .../views/projects_menus.xml | 33 +++++--- 5 files changed, 107 insertions(+), 76 deletions(-) create mode 100644 local-addons/merctrans_projects/models/merctrans_invoices.py diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py index 5ccf449..14d21de 100755 --- a/local-addons/merctrans_projects/models/__init__.py +++ b/local-addons/merctrans_projects/models/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # from . import merctrans_sales -from . import merctrans_clients, merctrans_pos, merctrans_projects +from . import merctrans_clients, merctrans_pos, merctrans_projects, merctrans_invoices diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py new file mode 100644 index 0000000..824418f --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from odoo.exceptions import ValidationError + +from odoo import api, fields, models + + +class MercTransInvoices(models.Model): + _name = 'merctrans.invoices' + _rec_name = 'invoice_name' + _description = 'MercTrans Invoices for Project Managers' + + status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), + ('unpaid', 'Unpaid')] + + invoice_id = fields.Integer('Invoice ID', + index=True, + store=True, + readonly=True, + default=lambda self: self.env['ir.sequence']. + next_by_code('increment_invoice_id')) + invoice_name = fields.Char('Invoice name', compute="_get_invoice_name") + invoice_date = fields.Date(string='Invoice Date') + invoice_client = fields.Many2one('merctrans.clients', + string='Client', + required='True') + invoice_details_ids = fields.Many2many('merctrans.projects', + string='Invoice Lines') + currency_id = fields.Many2one('res.currency', string='Currency') + invoice_value = fields.Float("Invoice Value", + compute="_compute_invoice_value") + invoice_status = fields.Selection(string="Invoice Status", + selection=status_list, + default='Unpaid') + + @api.depends('invoice_client', 'invoice_id') + @api.onchange('invoice_client', 'invoice_id') + def _get_invoice_name(self): + for inv in self: + if inv.invoice_client: + cl_name = "".join(inv.invoice_client.name.split()).upper() + else: + cl_name = "CLIE" + inv.invoice_name = f"INV{inv.invoice_id:05d}-{cl_name[:4]}-{fields.Date.today().strftime('%y%m%d')}" + + @api.depends('invoice_details_ids') + def _compute_invoice_value(self): + for item in self: + item.invoice_value = sum(line.project_value # x??? rename plz + for line in item.invoice_details_ids) + + @api.constrains('invoice_details_ids', 'currency_id') + def currency_constrains(self): + for job in self: + for x in job.invoice_details_ids: + if job.currency_id != x.currency_id: + raise ValidationError( + 'Job currency must be the same as invoice currency!') + + # @api.model + # def create(self, vals): + # print("Invoices Create Vals ", vals) + # return super(MercTransInvoices, self).create(vals) + # + # def write(self, vals): + # print("Invoices Write Vals ", vals) + # return super(MercTransInvoices, self).write(vals) + + @api.onchange('invoice_status') + def sync_status(self): + + for project in self.invoice_details_ids: + if self.invoice_status == 'paid': + project.write({'payment_status': 'paid'}) + if self.invoice_status == 'invoiced': + project.write({'payment_status': 'invoiced'}) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 1104aed..b70ca1c 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -116,10 +116,10 @@ class MerctransPOs(models.Model): def _get_purchase_order(self): for po in self: if po.project_id: - pj = po.project_id.project_id.split("-") + pj = po.project_id.project_id ctrb = po.contributor.name if po.contributor else "ctrb" ids = len(po.project_id.po_details) - po.purchase_order = f"PO{ids}-{ctrb[:3].upper()}|{pj[0]}{pj[1][2:]}" + po.purchase_order = f"PO{ids}-{ctrb[:3].upper()}|{pj}" else: po.purchase_order = "Select Project" diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index e4a1fbe..1d265ba 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -170,13 +170,14 @@ class MercTransProjects(models.Model): project_instruction = fields.Html('Project Instruction') - project_status = fields.Selection(string='Project Status', + project_status = fields.Selection(string='Project Status*', selection=project_status_list, required=True, default='in progress') - payment_status = fields.Selection(string='Payment Status', + payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, + required=True, default='unpaid') po_details = fields.One2many("merctrans.pos", @@ -211,14 +212,14 @@ def create(self, vals): @api.onchange('client') @api.depends('client') def _get_project_id(self): - create_time = datetime.today().strftime('%Y%m%d') + create_time = datetime.today().strftime('%y%m%d') for project in self: if project.client: # client is many2many nen can chinh sua lai 1 chut, chi lay ten cua thang dau tien, should be change with project.client client_name = project.client[0].name if len( project.client) > 1 else project.client.name - short_name = client_name[:4].upper() - project.project_id = f"{short_name}-{create_time}-{project.number_id}" + short_name = "".join(client_name.split()).upper() + project.project_id = f"{short_name[:4]}-{create_time}-{project.number_id:05d}" else: project.project_id = "on change" @@ -250,59 +251,3 @@ def _compute_margin(self): project.project_margin = ( project.project_value - project.total_po_value) / project.project_value - - -class MercTransInvoices(models.Model): - _name = 'merctrans.invoices' - _rec_name = 'invoice_name' - _description = 'MercTrans Invoices for Project Managers' - - status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), - ('unpaid', 'Unpaid')] - - invoice_id = fields.Integer('Invoice ID') - invoice_name = fields.Char('Invoice name') - invoice_date = fields.Date(string='Invoice Date') - invoice_client = fields.Many2one('merctrans.clients', - string='Client', - required='True') - invoice_details_ids = fields.Many2many('merctrans.projects', - string='Invoice Lines') - currency_id = fields.Many2one('res.currency', string='Currency') - invoice_value = fields.Float("Invoice Value", - compute="_compute_invoice_value") - invoice_status = fields.Selection(string="Invoice Status", - selection=status_list, - default='Unpaid') - - @api.depends('invoice_details_ids') - def _compute_invoice_value(self): - for item in self: - item.invoice_value = sum(line.project_value # x??? rename plz - for line in item.invoice_details_ids) - - @api.constrains('invoice_details_ids', 'currency_id') - def currency_constrains(self): - for job in self: - for x in job.invoice_details_ids: - if job.currency_id != x.currency_id: - raise ValidationError( - 'Job currency must be the same as invoice currency!') - - # @api.model - # def create(self, vals): - # print("Invoices Create Vals ", vals) - # return super(MercTransInvoices, self).create(vals) - # - # def write(self, vals): - # print("Invoices Write Vals ", vals) - # return super(MercTransInvoices, self).write(vals) - - @api.onchange('invoice_status') - def sync_status(self): - - for project in self.invoice_details_ids: - if self.invoice_status == 'paid': - project.write({'payment_status': 'paid'}) - if self.invoice_status == 'invoiced': - project.write({'payment_status': 'invoiced'}) diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index e5bf9ea..eb91a71 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -29,6 +29,15 @@ + + + ID Incrementation + increment_invoice_id + + 3 + + + invoices tree merctrans.invoices @@ -121,7 +130,7 @@ - + @@ -131,13 +140,13 @@ - + - - + + @@ -152,9 +161,9 @@ - + - + @@ -168,13 +177,13 @@ - + - + @@ -201,9 +210,9 @@ - + - + @@ -211,8 +220,8 @@ - - + + From bf6479c8f276aa834e8e2d3141a1c66196e769a2 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 13:20:36 +0700 Subject: [PATCH 53/74] merge commit client cannot create --- local-addons/merctrans_projects/views/projects_menus.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 3137cc5..b39f13d 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -130,12 +130,7 @@ -<<<<<<< HEAD - -======= - ->>>>>>> 75dfbb675983935c6b2560d2d21eda4ffb7ee8ec From a28f4c8be61e2ba48330ca6e752d7d9e9eb5a2ce Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 13:38:55 +0700 Subject: [PATCH 54/74] fix bug, domain err >> variables in domain need defined --- .../merctrans_projects/models/merctrans_pos.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index a5f716b..0a3321e 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -39,6 +39,9 @@ class MerctransPOs(models.Model): readonly=True, compute='_get_street_contributor') + project_id = fields.Many2one('merctrans.projects', + string="Project", + store=True) contributor_id = fields.Char('Id', store=True, readonly=True, @@ -103,12 +106,9 @@ class MerctransPOs(models.Model): string='Due Date*', required=True, default=lambda self: self.env['merctrans.projects'].search([( - 'project_id', '=', 'project_id.project_id')]).due_date) + 'project_id', '=', project_id.project_id)]).due_date) # From Projects? - project_id = fields.Many2one('merctrans.projects', - string="Project", - store=True) # Get contributor address @api.onchange('project_id', 'contributor') @@ -148,7 +148,11 @@ def _get_id_contributor(self): @api.onchange('project_id') @api.depends('project_id') def _get_project_source(self): - self.source_language = self.project_id.source_language + for po in self: + if po.project_id.source_language: + po.source_language = po.project_id.source_language + else: + po.source_language = "Choose Project" # @api.onchange('project_id') # @api.depends('project_id') @@ -177,8 +181,10 @@ def _get_project_valid_date(self): @api.depends('project_id') def _get_project_target(self): for po in self: - if po.project_id: + if po.project_id.target_language: po.target_language = po.project_id.target_language + else: + po.target_language = 'Choose Project' # po start date must greater than project start date @api.depends('project_id') From fa068b6d26b32314592018fa5758385410fa65aa Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 13:48:15 +0700 Subject: [PATCH 55/74] form PO cant create --- local-addons/merctrans_projects/views/pos.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/views/pos.xml b/local-addons/merctrans_projects/views/pos.xml index 7ace37d..9d5620d 100755 --- a/local-addons/merctrans_projects/views/pos.xml +++ b/local-addons/merctrans_projects/views/pos.xml @@ -12,7 +12,7 @@ Purchase Order Form merctrans.pos -
+ From 35620fb55f146721dbc1b04e973a7c743ac99fb5 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 13:55:46 +0700 Subject: [PATCH 56/74] missing self keyword in defaul due_date in pos.py --- local-addons/merctrans_projects/models/merctrans_pos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 0a3321e..77c470f 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -106,7 +106,7 @@ class MerctransPOs(models.Model): string='Due Date*', required=True, default=lambda self: self.env['merctrans.projects'].search([( - 'project_id', '=', project_id.project_id)]).due_date) + 'project_id', '=', self.project_id.project_id)]).due_date) # From Projects? From 41e2c3d8a973972a656c88b7f1f0c829a0c06098 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 14:03:15 +0700 Subject: [PATCH 57/74] facing bug default due_date --- local-addons/merctrans_projects/models/merctrans_pos.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 77c470f..30095b8 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -105,8 +105,9 @@ class MerctransPOs(models.Model): due_date = fields.Date( string='Due Date*', required=True, - default=lambda self: self.env['merctrans.projects'].search([( - 'project_id', '=', self.project_id.project_id)]).due_date) + default=fields.Date.today()) + # default=lambda self: self.env['merctrans.projects'].search([( + # 'project_id', '=', self.project_id.project_id)]).due_date) # From Projects? From 3f5189ed47d08296daf4e5fc95650b229e666bc5 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 14:12:14 +0700 Subject: [PATCH 58/74] turn off create in tree view --- local-addons/merctrans_projects/views/pos.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/views/pos.xml b/local-addons/merctrans_projects/views/pos.xml index 9d5620d..37d6188 100755 --- a/local-addons/merctrans_projects/views/pos.xml +++ b/local-addons/merctrans_projects/views/pos.xml @@ -48,7 +48,7 @@ Purchase Order Tree merctrans.pos - + From eede13445ca52703e8cca6cfc7620f853b23725a Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 22 Jul 2022 14:33:28 +0700 Subject: [PATCH 59/74] add 3 digit ids --- .../merctrans_projects/models/merctrans_pos.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 30095b8..e94cef0 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -102,12 +102,11 @@ class MerctransPOs(models.Model): required=True, default=fields.Date.today()) - due_date = fields.Date( - string='Due Date*', - required=True, - default=fields.Date.today()) - # default=lambda self: self.env['merctrans.projects'].search([( - # 'project_id', '=', self.project_id.project_id)]).due_date) + due_date = fields.Date(string='Due Date*', + required=True, + default=fields.Date.today()) + # default=lambda self: self.env['merctrans.projects'].search([( + # 'project_id', '=', self.project_id.project_id)]).due_date) # From Projects? @@ -120,7 +119,7 @@ def _get_purchase_order(self): pj = po.project_id.project_id ctrb = po.contributor.name if po.contributor else "ctrb" ids = len(po.project_id.po_details) - po.purchase_order = f"PO{ids}-{ctrb[:3].upper()}|{pj}" + po.purchase_order = f"PO{ids:03d}-{ctrb[:3].upper()}|{pj}" else: po.purchase_order = "Select Project" From 4a611e744f566f246893e314c25e9ce6fb859693 Mon Sep 17 00:00:00 2001 From: truong tang Date: Tue, 26 Jul 2022 07:22:51 +0700 Subject: [PATCH 60/74] fix client fields --- local-addons/merctrans_projects/models/merctrans_clients.py | 3 ++- local-addons/merctrans_projects/views/clients.xml | 4 ++-- local-addons/merctrans_projects/views/projects_menus.xml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index c889349..5bd8ddf 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -33,6 +33,7 @@ class MerctransClient(models.Model): 'invoice_client', domain=[('invoice_status', '=', 'unpaid') ]) + client_contact_list = fields.Many2many('res.partner', required=True) # client_currency = fields.Many2one('res.currency', # string="Currency",) @@ -52,5 +53,5 @@ def validate_email(self): match = re.match( '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', self.email) - if match == None: + if match is None: raise ValidationError('Not a valid email') diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index e9e6ec1..b43b174 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -7,7 +7,7 @@ - Client Form + Account Form View merctrans.clients @@ -45,7 +45,7 @@ - Client Tree + Account Tree View merctrans.clients diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index b39f13d..4f01168 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -25,7 +25,7 @@ - + From 043701054066332e427307324142dcd2da58e537 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 10:08:23 +0700 Subject: [PATCH 61/74] add xlwt package and bring odoo Dockerfile to local --- Dockerfile | 90 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 2 +- entrypoint.sh | 49 +++++++++++++++++++++++++ odoo.conf | 37 +++++++++++++++++++ wait-for-psql.py | 35 ++++++++++++++++++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 entrypoint.sh create mode 100644 odoo.conf create mode 100644 wait-for-psql.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ef46513 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,90 @@ +FROM debian:bullseye-slim +MAINTAINER Odoo S.A. + +SHELL ["/bin/bash", "-xo", "pipefail", "-c"] + +# Generate locale C.UTF-8 for postgres and general locale data +ENV LANG C.UTF-8 + +# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + dirmngr \ + fonts-noto-cjk \ + gnupg \ + libssl-dev \ + node-less \ + npm \ + python3-num2words \ + python3-pdfminer \ + python3-pip \ + python3-phonenumbers \ + python3-pyldap \ + python3-qrcode \ + python3-renderpm \ + python3-setuptools \ + python3-slugify \ + python3-vobject \ + python3-watchdog \ + python3-xlrd \ + python3-xlwt \ + xz-utils \ + && curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.buster_amd64.deb \ + && echo 'ea8277df4297afc507c61122f3c349af142f31e5 wkhtmltox.deb' | sha1sum -c - \ + && apt-get install -y --no-install-recommends ./wkhtmltox.deb \ + && rm -rf /var/lib/apt/lists/* wkhtmltox.deb + +RUN sudo pip install xlwt==1.1.2 + +# install latest postgresql-client +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \ + && GNUPGHOME="$(mktemp -d)" \ + && export GNUPGHOME \ + && repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \ + && gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \ + && gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \ + && gpgconf --kill all \ + && rm -rf "$GNUPGHOME" \ + && apt-get update \ + && apt-get install --no-install-recommends -y postgresql-client \ + && rm -f /etc/apt/sources.list.d/pgdg.list \ + && rm -rf /var/lib/apt/lists/* + +# Install rtlcss (on Debian buster) +RUN npm install -g rtlcss + +# Install Odoo +ENV ODOO_VERSION 15.0 +ARG ODOO_RELEASE=20220718 +ARG ODOO_SHA=dc4a5b8c5be8f873e751539117f5aa41d9f7b217 +RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \ + && echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \ + && apt-get update \ + && apt-get -y install --no-install-recommends ./odoo.deb \ + && rm -rf /var/lib/apt/lists/* odoo.deb + +# Copy entrypoint script and Odoo configuration file +COPY ./entrypoint.sh / +COPY ./odoo.conf /etc/odoo/ + +# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons +RUN chown odoo /etc/odoo/odoo.conf \ + && mkdir -p /mnt/extra-addons \ + && chown -R odoo /mnt/extra-addons +VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] + +# Expose Odoo services +EXPOSE 8069 8071 8072 + +# Set the default config file +ENV ODOO_RC /etc/odoo/odoo.conf + +COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py + +# Set default user when running the container +USER odoo + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["odoo"] diff --git a/docker-compose.yml b/docker-compose.yml index 5aaca81..d2b1582 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.1" services: web_prod: - image: odoo:15.0 + build: . depends_on: - db ports: diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..f802bcb --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -e + +if [ -v PASSWORD_FILE ]; then + PASSWORD="$(< $PASSWORD_FILE)" +fi + +# set the postgres database host, port, user and password according to the environment +# and pass them as arguments to the odoo process if not present in the config file +: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} +: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} +: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} +: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} + +DB_ARGS=() +function check_config() { + param="$1" + value="$2" + if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then + value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g') + fi; + DB_ARGS+=("--${param}") + DB_ARGS+=("${value}") +} +check_config "db_host" "$HOST" +check_config "db_port" "$PORT" +check_config "db_user" "$USER" +check_config "db_password" "$PASSWORD" + +case "$1" in + -- | odoo) + shift + if [[ "$1" == "scaffold" ]] ; then + exec odoo "$@" + else + wait-for-psql.py ${DB_ARGS[@]} --timeout=30 + exec odoo "$@" "${DB_ARGS[@]}" + fi + ;; + -*) + wait-for-psql.py ${DB_ARGS[@]} --timeout=30 + exec odoo "$@" "${DB_ARGS[@]}" + ;; + *) + exec "$@" +esac + +exit 1 diff --git a/odoo.conf b/odoo.conf new file mode 100644 index 0000000..28f70c1 --- /dev/null +++ b/odoo.conf @@ -0,0 +1,37 @@ +[options] +addons_path = /mnt/extra-addons +data_dir = /var/lib/odoo +; admin_passwd = admin +; csv_internal_sep = , +; db_maxconn = 64 +; db_name = False +; db_template = template1 +; dbfilter = .* +; debug_mode = False +; email_from = False +; limit_memory_hard = 2684354560 +; limit_memory_soft = 2147483648 +; limit_request = 8192 +; limit_time_cpu = 60 +; limit_time_real = 120 +; list_db = True +; log_db = False +; log_handler = [':INFO'] +; log_level = info +; logfile = None +; longpolling_port = 8072 +; max_cron_threads = 2 +; osv_memory_age_limit = 1.0 +; osv_memory_count_limit = False +; smtp_password = False +; smtp_port = 25 +; smtp_server = localhost +; smtp_ssl = False +; smtp_user = False +; workers = 0 +; xmlrpc = True +; xmlrpc_interface = +; xmlrpc_port = 8069 +; xmlrpcs = True +; xmlrpcs_interface = +; xmlrpcs_port = 8071 diff --git a/wait-for-psql.py b/wait-for-psql.py new file mode 100644 index 0000000..840c49b --- /dev/null +++ b/wait-for-psql.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import argparse +import psycopg2 +import sys +import time + +if __name__ == '__main__': + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument('--db_host', required=True) + arg_parser.add_argument('--db_port', required=True) + arg_parser.add_argument('--db_user', required=True) + arg_parser.add_argument('--db_password', required=True) + arg_parser.add_argument('--timeout', type=int, default=5) + + args = arg_parser.parse_args() + + start_time = time.time() + while (time.time() - start_time) < args.timeout: + try: + conn = psycopg2.connect(user=args.db_user, + host=args.db_host, + port=args.db_port, + password=args.db_password, + dbname='postgres') + error = '' + break + except psycopg2.OperationalError as e: + error = e + else: + conn.close() + time.sleep(1) + + if error: + print("Database connection failure: %s" % error, file=sys.stderr) + sys.exit(1) From 329785297766b0a53bb5b30aa868cc3ca930b449 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 10:14:26 +0700 Subject: [PATCH 62/74] No need sudo install xlwt --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index ef46513..c475172 100644 --- a/Dockerfile +++ b/Dockerfile @@ -36,7 +36,7 @@ RUN apt-get update && \ && apt-get install -y --no-install-recommends ./wkhtmltox.deb \ && rm -rf /var/lib/apt/lists/* wkhtmltox.deb -RUN sudo pip install xlwt==1.1.2 +RUN pip install xlwt==1.1.2 # install latest postgresql-client RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \ From 5e87fe2e95cb14c4ac84cafaa923041f4b312eeb Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 12:49:38 +0700 Subject: [PATCH 63/74] model contributors done --- .../merctrans_projects/__manifest__.py | 1 + .../merctrans_projects/models/__init__.py | 2 +- .../models/merctrans_contributors.py | 56 ++++++++++++++++ .../models/merctrans_pos.py | 4 +- .../security/ir.model.access.csv | 1 + .../merctrans_projects/views/contributors.xml | 65 +++++++++++++++++++ .../views/projects_menus.xml | 3 +- 7 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 local-addons/merctrans_projects/models/merctrans_contributors.py create mode 100755 local-addons/merctrans_projects/views/contributors.xml diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index ef0c9be..12aee98 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -36,6 +36,7 @@ # View <> 'views/pos.xml', 'views/clients.xml', + 'views/contributors.xml', 'views/projects_menus.xml', 'views/templates.xml', # 'views/sale.xml', diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py index 14d21de..542f40f 100755 --- a/local-addons/merctrans_projects/models/__init__.py +++ b/local-addons/merctrans_projects/models/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- # from . import merctrans_sales -from . import merctrans_clients, merctrans_pos, merctrans_projects, merctrans_invoices +from . import merctrans_clients, merctrans_pos, merctrans_projects, merctrans_invoices, merctrans_contributors diff --git a/local-addons/merctrans_projects/models/merctrans_contributors.py b/local-addons/merctrans_projects/models/merctrans_contributors.py new file mode 100644 index 0000000..0fe71eb --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrans_contributors.py @@ -0,0 +1,56 @@ +import re +from odoo.exceptions import ValidationError +from odoo import api, fields, models + + +class MerctransClient(models.Model): + + _name = 'merctrans.contributors' + + _rec_name = 'name' + + _description = "Merctrans's Contributors" + _inherits = {'res.partner': 'partner_id'} + + # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, + # string='Related Partner', help='Partner-related data of the user') + partner_id = fields.Many2one('res.partner', + required=True, + ondelete='cascade') + + country = fields.Many2one('res.country', string='Country') + currency = fields.Many2one('res.currency', 'Currency') + + contributor_note = fields.Html('Client note') + + phone_number = fields.Char(string='Phone number') + + pos_history = fields.One2many('merctrans.pos', + 'contributor', + readonly=True) + + # invoice_history = fields.One2many('merctrans.invoices', + # 'invoice_client', + # domain=[('invoice_status', '=', 'unpaid') + # ]) + + # client_currency = fields.Many2one('res.currency', + # string="Currency",) + + @api.constrains('name') + def check_duplicate_name(self): + for contributor in self: + contributor = self.env['merctrans.pos'].search([ + ('name', '=', self.name), ('id', '!=', self.id) + ]) + if contributor: + raise ValidationError('Company name cannot be duplicated!') + + @api.constrains('email') + def validate_email(self): + if self.email: + match = re.match( + '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', + self.email) + if match is None: + raise ValidationError('Not a valid email') diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index e94cef0..1aa01c7 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -32,7 +32,9 @@ class MerctransPOs(models.Model): readonly=True, compute="_get_purchase_order") - contributor = fields.Many2one('res.users', 'Contributor*', required=True) + contributor = fields.Many2one('merctrans.contributors', + 'Contributor*', + required=True) address = fields.Char('Address', store=True, diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv index 6d05cd5..c818954 100755 --- a/local-addons/merctrans_projects/security/ir.model.access.csv +++ b/local-addons/merctrans_projects/security/ir.model.access.csv @@ -4,4 +4,5 @@ acl_pm_services,merctransproject.service_default,model_merctrans_services,group_ acl_pm_invoices,merctransproject.invoices_default,model_merctrans_invoices,group_merctrans_pm,1,1,1,1 acl_pm_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_pm,1,1,1,1 acl_pm_clients,merctransproject.clients_default,model_merctrans_clients,group_merctrans_pm,1,1,1,1 +acl_pm_contributors,merctransproject.contributors_default,model_merctrans_contributors,group_merctrans_pm,1,1,1,1 acl_contributor_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_contributor,1,0,0,0 diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml new file mode 100755 index 0000000..27f08f1 --- /dev/null +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -0,0 +1,65 @@ + + + + Merctrans Contributors List + merctrans.contributors + tree,form + + + + + + Contributors Form + merctrans.contributors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contributors Tree + merctrans.contributors + + + + + + + + + + + + + + + Contributors Search + merctrans.contributors + + + + + + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index b39f13d..a7bf8ea 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -26,7 +26,8 @@ - + + From 604a02db3e1f22d8dc7c42c5a423ddb8474df491 Mon Sep 17 00:00:00 2001 From: truong tang Date: Tue, 26 Jul 2022 15:40:10 +0700 Subject: [PATCH 64/74] change contributor -> res.users and add total po field --- .../models/merctrans_contributors.py | 15 +++++++++------ .../merctrans_projects/views/contributors.xml | 7 +++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_contributors.py b/local-addons/merctrans_projects/models/merctrans_contributors.py index 0fe71eb..c76edb3 100644 --- a/local-addons/merctrans_projects/models/merctrans_contributors.py +++ b/local-addons/merctrans_projects/models/merctrans_contributors.py @@ -10,14 +10,11 @@ class MerctransClient(models.Model): _rec_name = 'name' _description = "Merctrans's Contributors" - _inherits = {'res.partner': 'partner_id'} + _inherits = {'res.users': 'user_id'} # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - partner_id = fields.Many2one('res.partner', - required=True, - ondelete='cascade') - + user_id = fields.Many2one('res.users', required=True) country = fields.Many2one('res.country', string='Country') currency = fields.Many2one('res.currency', 'Currency') @@ -28,6 +25,7 @@ class MerctransClient(models.Model): pos_history = fields.One2many('merctrans.pos', 'contributor', readonly=True) + total_po = fields.Integer('Total PO', readonly=True, compute='_get_total_po') # invoice_history = fields.One2many('merctrans.invoices', # 'invoice_client', @@ -36,7 +34,12 @@ class MerctransClient(models.Model): # client_currency = fields.Many2one('res.currency', # string="Currency",) - + def _get_total_po(self): + for contributor in self: + if contributor.pos_history: + contributor.total_po = len(contributor.pos_history) + else: + contributor.total_po = 0 @api.constrains('name') def check_duplicate_name(self): for contributor in self: diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 27f08f1..738f8a5 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -16,7 +16,7 @@ - + @@ -24,6 +24,9 @@ + + + @@ -43,7 +46,7 @@ merctrans.contributors - + From 744eee75be9020ee719dd6346f07e5b243162099 Mon Sep 17 00:00:00 2001 From: truong tang Date: Tue, 26 Jul 2022 15:42:16 +0700 Subject: [PATCH 65/74] total po in tree view --- local-addons/merctrans_projects/views/contributors.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 738f8a5..5dd9cb1 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -50,6 +50,7 @@ + From f4d4be8a843cd8feb22aa362d08a7632c9cc0a5e Mon Sep 17 00:00:00 2001 From: truong tang Date: Tue, 26 Jul 2022 15:57:48 +0700 Subject: [PATCH 66/74] update gitignore tren may anh truong --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d4b955b..438ea89 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,10 @@ odoo/ docker-compose.yml tags venv - - +*.swp +Dockerfile local-addons/merctrans_projects/__pycache__ local-addons/merctrans_projects/controllers/__pycache__ local-addons/merctrans_projects/models/__pycache__ odoo -tags \ No newline at end of file +tags From 06bb2ce908286271701ab69f352eb9a2b9505581 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 16:37:18 +0700 Subject: [PATCH 67/74] change contributor res.partner -> res.users --- .../models/merctrans_contributors.py | 16 ++++++++++++---- .../merctrans_projects/views/contributors.xml | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_contributors.py b/local-addons/merctrans_projects/models/merctrans_contributors.py index 0fe71eb..39f5779 100644 --- a/local-addons/merctrans_projects/models/merctrans_contributors.py +++ b/local-addons/merctrans_projects/models/merctrans_contributors.py @@ -10,13 +10,11 @@ class MerctransClient(models.Model): _rec_name = 'name' _description = "Merctrans's Contributors" - _inherits = {'res.partner': 'partner_id'} + _inherits = {'res.users': 'user_id'} # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - partner_id = fields.Many2one('res.partner', - required=True, - ondelete='cascade') + user_id = fields.Many2one('res.users', required=True, ondelete='cascade') country = fields.Many2one('res.country', string='Country') currency = fields.Many2one('res.currency', 'Currency') @@ -28,6 +26,9 @@ class MerctransClient(models.Model): pos_history = fields.One2many('merctrans.pos', 'contributor', readonly=True) + total_po = fields.Integer('Total PO', + readonly=True, + compute="_get_total_po") # invoice_history = fields.One2many('merctrans.invoices', # 'invoice_client', @@ -37,6 +38,13 @@ class MerctransClient(models.Model): # client_currency = fields.Many2one('res.currency', # string="Currency",) + def _get_total_po(self): + for contributor in self: + if contributor.pos_history: + contributor.total_po = len(contributor.pos_history) + else: + contributor.total_po = 0 + @api.constrains('name') def check_duplicate_name(self): for contributor in self: diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 27f08f1..9c8f6bf 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -16,7 +16,7 @@ - + @@ -24,6 +24,9 @@ + + + @@ -43,7 +46,8 @@ merctrans.contributors - + + From 7b6c65c1681b222e3cf8ab8321c02f3a85e7a881 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 17:29:07 +0700 Subject: [PATCH 68/74] hoanglong pro vcl -> new images odoo --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d2b1582..d6ecee6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.1" services: web_prod: - build: . + image: hglong16/odoo:latest depends_on: - db ports: From 055c9e4db0295b122df8ff33733db3b8ac8d99e2 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Tue, 26 Jul 2022 18:29:41 +0700 Subject: [PATCH 69/74] sua loi cua anh Truong integer != Char --- .../merctrans_projects/models/merctrans_pos.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index 1aa01c7..dd47eec 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -44,10 +44,10 @@ class MerctransPOs(models.Model): project_id = fields.Many2one('merctrans.projects', string="Project", store=True) - contributor_id = fields.Char('Id', - store=True, - readonly=True, - compute='_get_id_contributor') + contributor_id = fields.Integer('Id', + store=True, + readonly=True, + compute='_get_id_contributor') contributor_email = fields.Char('Email', store=True, @@ -145,7 +145,7 @@ def _get_email_contributor(self): def _get_id_contributor(self): for project in self: print(project.contributor.id) - project.contributor_id = project.contributor.id + project.contributor_id = project.contributor.user_id @api.onchange('project_id') @api.depends('project_id') From eef5e024bf1f4ada346caec181623c6be0d0b9a8 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 09:24:10 +0700 Subject: [PATCH 70/74] clean docker --- Dockerfile | 90 ------------------------------------------------ entrypoint.sh | 49 -------------------------- odoo.conf | 37 -------------------- wait-for-psql.py | 35 ------------------- 4 files changed, 211 deletions(-) delete mode 100644 Dockerfile delete mode 100644 entrypoint.sh delete mode 100644 odoo.conf delete mode 100644 wait-for-psql.py diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index c475172..0000000 --- a/Dockerfile +++ /dev/null @@ -1,90 +0,0 @@ -FROM debian:bullseye-slim -MAINTAINER Odoo S.A. - -SHELL ["/bin/bash", "-xo", "pipefail", "-c"] - -# Generate locale C.UTF-8 for postgres and general locale data -ENV LANG C.UTF-8 - -# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - ca-certificates \ - curl \ - dirmngr \ - fonts-noto-cjk \ - gnupg \ - libssl-dev \ - node-less \ - npm \ - python3-num2words \ - python3-pdfminer \ - python3-pip \ - python3-phonenumbers \ - python3-pyldap \ - python3-qrcode \ - python3-renderpm \ - python3-setuptools \ - python3-slugify \ - python3-vobject \ - python3-watchdog \ - python3-xlrd \ - python3-xlwt \ - xz-utils \ - && curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.buster_amd64.deb \ - && echo 'ea8277df4297afc507c61122f3c349af142f31e5 wkhtmltox.deb' | sha1sum -c - \ - && apt-get install -y --no-install-recommends ./wkhtmltox.deb \ - && rm -rf /var/lib/apt/lists/* wkhtmltox.deb - -RUN pip install xlwt==1.1.2 - -# install latest postgresql-client -RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \ - && GNUPGHOME="$(mktemp -d)" \ - && export GNUPGHOME \ - && repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \ - && gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \ - && gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \ - && gpgconf --kill all \ - && rm -rf "$GNUPGHOME" \ - && apt-get update \ - && apt-get install --no-install-recommends -y postgresql-client \ - && rm -f /etc/apt/sources.list.d/pgdg.list \ - && rm -rf /var/lib/apt/lists/* - -# Install rtlcss (on Debian buster) -RUN npm install -g rtlcss - -# Install Odoo -ENV ODOO_VERSION 15.0 -ARG ODOO_RELEASE=20220718 -ARG ODOO_SHA=dc4a5b8c5be8f873e751539117f5aa41d9f7b217 -RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \ - && echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \ - && apt-get update \ - && apt-get -y install --no-install-recommends ./odoo.deb \ - && rm -rf /var/lib/apt/lists/* odoo.deb - -# Copy entrypoint script and Odoo configuration file -COPY ./entrypoint.sh / -COPY ./odoo.conf /etc/odoo/ - -# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons -RUN chown odoo /etc/odoo/odoo.conf \ - && mkdir -p /mnt/extra-addons \ - && chown -R odoo /mnt/extra-addons -VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] - -# Expose Odoo services -EXPOSE 8069 8071 8072 - -# Set the default config file -ENV ODOO_RC /etc/odoo/odoo.conf - -COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py - -# Set default user when running the container -USER odoo - -ENTRYPOINT ["/entrypoint.sh"] -CMD ["odoo"] diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index f802bcb..0000000 --- a/entrypoint.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -set -e - -if [ -v PASSWORD_FILE ]; then - PASSWORD="$(< $PASSWORD_FILE)" -fi - -# set the postgres database host, port, user and password according to the environment -# and pass them as arguments to the odoo process if not present in the config file -: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} -: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} -: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} -: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} - -DB_ARGS=() -function check_config() { - param="$1" - value="$2" - if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then - value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g') - fi; - DB_ARGS+=("--${param}") - DB_ARGS+=("${value}") -} -check_config "db_host" "$HOST" -check_config "db_port" "$PORT" -check_config "db_user" "$USER" -check_config "db_password" "$PASSWORD" - -case "$1" in - -- | odoo) - shift - if [[ "$1" == "scaffold" ]] ; then - exec odoo "$@" - else - wait-for-psql.py ${DB_ARGS[@]} --timeout=30 - exec odoo "$@" "${DB_ARGS[@]}" - fi - ;; - -*) - wait-for-psql.py ${DB_ARGS[@]} --timeout=30 - exec odoo "$@" "${DB_ARGS[@]}" - ;; - *) - exec "$@" -esac - -exit 1 diff --git a/odoo.conf b/odoo.conf deleted file mode 100644 index 28f70c1..0000000 --- a/odoo.conf +++ /dev/null @@ -1,37 +0,0 @@ -[options] -addons_path = /mnt/extra-addons -data_dir = /var/lib/odoo -; admin_passwd = admin -; csv_internal_sep = , -; db_maxconn = 64 -; db_name = False -; db_template = template1 -; dbfilter = .* -; debug_mode = False -; email_from = False -; limit_memory_hard = 2684354560 -; limit_memory_soft = 2147483648 -; limit_request = 8192 -; limit_time_cpu = 60 -; limit_time_real = 120 -; list_db = True -; log_db = False -; log_handler = [':INFO'] -; log_level = info -; logfile = None -; longpolling_port = 8072 -; max_cron_threads = 2 -; osv_memory_age_limit = 1.0 -; osv_memory_count_limit = False -; smtp_password = False -; smtp_port = 25 -; smtp_server = localhost -; smtp_ssl = False -; smtp_user = False -; workers = 0 -; xmlrpc = True -; xmlrpc_interface = -; xmlrpc_port = 8069 -; xmlrpcs = True -; xmlrpcs_interface = -; xmlrpcs_port = 8071 diff --git a/wait-for-psql.py b/wait-for-psql.py deleted file mode 100644 index 840c49b..0000000 --- a/wait-for-psql.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import psycopg2 -import sys -import time - -if __name__ == '__main__': - arg_parser = argparse.ArgumentParser() - arg_parser.add_argument('--db_host', required=True) - arg_parser.add_argument('--db_port', required=True) - arg_parser.add_argument('--db_user', required=True) - arg_parser.add_argument('--db_password', required=True) - arg_parser.add_argument('--timeout', type=int, default=5) - - args = arg_parser.parse_args() - - start_time = time.time() - while (time.time() - start_time) < args.timeout: - try: - conn = psycopg2.connect(user=args.db_user, - host=args.db_host, - port=args.db_port, - password=args.db_password, - dbname='postgres') - error = '' - break - except psycopg2.OperationalError as e: - error = e - else: - conn.close() - time.sleep(1) - - if error: - print("Database connection failure: %s" % error, file=sys.stderr) - sys.exit(1) From 37a21c0b9ccef2098ef98d76aa45bb8beb01adac Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 09:26:54 +0700 Subject: [PATCH 71/74] fix things --- Dockerfile | 3 ++- docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c475172..3b6025f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,7 +72,8 @@ COPY ./odoo.conf /etc/odoo/ # Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons RUN chown odoo /etc/odoo/odoo.conf \ && mkdir -p /mnt/extra-addons \ - && chown -R odoo /mnt/extra-addons + && chown -R odoo /mnt/extra-addons \ + && chown -R odoo /entrypoint.sh VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] # Expose Odoo services diff --git a/docker-compose.yml b/docker-compose.yml index d2b1582..33c5d06 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.1" services: web_prod: - build: . + images: odoo:15 depends_on: - db ports: From e282ab2a9a13bae9c58e82835c3e8e8e5d23db7a Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 09:44:35 +0700 Subject: [PATCH 72/74] open ports 8070 8071 --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index d6ecee6..76d547c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,8 @@ services: - db ports: - "8069:8069" + - "8070:8072" + - "8071:8071" volumes: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo From b0e9e25fa8c050a891f30e4c0e40d7b1afab021e Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 12:04:20 +0700 Subject: [PATCH 73/74] fix clients, fix client view, change client to account, add contact to client --- .../models/merctrans_clients.py | 29 ++++++--- .../models/merctrans_contributors.py | 2 +- .../models/merctrans_projects.py | 2 +- .../merctrans_projects/views/clients.xml | 62 ++++++++++++++++++- .../views/projects_menus.xml | 3 +- 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 5bd8ddf..e136f91 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -11,15 +11,14 @@ class MerctransClient(models.Model): _description = "Merctrans's Clients" - # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, + # partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, # string='Related Partner', help='Partner-related data of the user') - name = fields.Char(string='Client') - + name = fields.Char(string='Account') email = fields.Char(string='Email') country = fields.Many2one('res.country', string='Country') - client_note = fields.Html('Client note') + client_note = fields.Html('Account note') phone_number = fields.Char(string='Phone number') @@ -30,10 +29,10 @@ class MerctransClient(models.Model): readonly=True) invoice_history = fields.One2many('merctrans.invoices', - 'invoice_client', - domain=[('invoice_status', '=', 'unpaid') - ]) - client_contact_list = fields.Many2many('res.partner', required=True) + 'invoice_client', readonly=True) + # domain=[('invoice_status', '=', 'unpaid') + # ]) + client_contact_list = fields.One2many('account.contacts','contact_account', readonly=True) # client_currency = fields.Many2one('res.currency', # string="Currency",) @@ -55,3 +54,17 @@ def validate_email(self): self.email) if match is None: raise ValidationError('Not a valid email') + +class AccountContact(models.Model): + + _name = 'account.contacts' + _rec_name = 'contact_name' + _description = 'MercTrans Account Contact list' + + + contact_account = fields.Many2one('merctrans.clients', required=True) + contact_name = fields.Char(string='Name') + contact_position = fields.Char(string='Position') + contact_email = fields.Char(string='Email') + contact_phone = fields.Char(string='Phone Number') + contact_note = fields.Text(string='Note') \ No newline at end of file diff --git a/local-addons/merctrans_projects/models/merctrans_contributors.py b/local-addons/merctrans_projects/models/merctrans_contributors.py index 39f5779..6049853 100644 --- a/local-addons/merctrans_projects/models/merctrans_contributors.py +++ b/local-addons/merctrans_projects/models/merctrans_contributors.py @@ -52,7 +52,7 @@ def check_duplicate_name(self): ('name', '=', self.name), ('id', '!=', self.id) ]) if contributor: - raise ValidationError('Company name cannot be duplicated!') + raise ValidationError('Contributor name cannot be duplicated!') @api.constrains('email') def validate_email(self): diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 1d265ba..b960b16 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -223,7 +223,7 @@ def _get_project_id(self): else: project.project_id = "on change" - @api.onchange('volume', 'rate_per_work_unit') + @api.onchange('volume', 'sale_rate') @api.depends('volume', 'sale_rate', 'discount') def _compute_project_value(self): for project in self: diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index b43b174..2b741b8 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -1,10 +1,20 @@ - Merctrans Clients List + Merctrans Account List merctrans.clients tree,form + + + + Account Contacts + account.contacts + tree,form + + + + Account Form View @@ -22,7 +32,17 @@ - + + + + + + + + + + + @@ -59,5 +79,43 @@
+ + + + + Account Contact Tree + account.contacts + + + + + + + + + + + + + + + Account Contact Form + account.contacts + +
+ + + + + + + + + + + +
+
+
diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 7306b5b..e5dc73f 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -25,8 +25,7 @@ - - + From 0a9197ff61543179fa9ab14dddfaec6940a4dcc7 Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 12:47:06 +0700 Subject: [PATCH 74/74] fix contact email constrains --- .../merctrans_projects/models/merctrans_clients.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index e136f91..63e72f9 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -67,4 +67,13 @@ class AccountContact(models.Model): contact_position = fields.Char(string='Position') contact_email = fields.Char(string='Email') contact_phone = fields.Char(string='Phone Number') - contact_note = fields.Text(string='Note') \ No newline at end of file + contact_note = fields.Text(string='Note') + + @api.constrains('contact_email') + def validate_email(self): + if self.contact_email: + match = re.match( + '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', + self.contact_email) + if match is None: + raise ValidationError('Not a valid email') \ No newline at end of file