From 4109ce018a31620b820856ab0b46e5a11f628ede Mon Sep 17 00:00:00 2001 From: hglong16 Date: Fri, 3 Jun 2022 19:15:13 +0700 Subject: [PATCH 001/112] 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 002/112] 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 003/112] 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 004/112] 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 005/112] 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 006/112] 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 007/112] 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 008/112] 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 009/112] 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 010/112] 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 011/112] 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 012/112] 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 013/112] 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 014/112] 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 015/112] 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 016/112] 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 017/112] 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 018/112] 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 019/112] 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 020/112] 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 021/112] 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 022/112] 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 023/112] 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 024/112] 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 025/112] 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 026/112] 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 027/112] 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 028/112] 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 029/112] 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 030/112] 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 031/112] 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 032/112] 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 033/112] 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 034/112] 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 035/112] 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 036/112] 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 037/112] 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 038/112] 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 039/112] 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 040/112] 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 041/112] 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 042/112] 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 043/112] 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 044/112] 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 045/112] 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 046/112] 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 047/112] 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 048/112] 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 049/112] 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 050/112] 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 051/112] 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 052/112] 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 053/112] 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 054/112] 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 055/112] 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 056/112] 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 057/112] 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 058/112] 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 059/112] 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 060/112] 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 061/112] 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 062/112] 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 063/112] 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 064/112] 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 065/112] 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 066/112] 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 067/112] 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 068/112] 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 069/112] 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 070/112] 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 071/112] 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 072/112] 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 349e68663e1b56f8c6f31ff21c8dbd6757fe1e01 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 11:07:39 +0700 Subject: [PATCH 073/112] nginx done --- Dockerfile-nginx | 11 +++++++++ config/odoo.conf | 26 ++++++++++---------- docker-compose.yml | 20 +++++++++------ odoo-nginx.conf | 56 ++++++++++++++++++++++++++++++++++++++++++ odoo-nginx_ssl.conf | 60 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 152 insertions(+), 21 deletions(-) create mode 100644 Dockerfile-nginx create mode 100644 odoo-nginx.conf create mode 100644 odoo-nginx_ssl.conf diff --git a/Dockerfile-nginx b/Dockerfile-nginx new file mode 100644 index 0000000..4430534 --- /dev/null +++ b/Dockerfile-nginx @@ -0,0 +1,11 @@ +FROM nginx:latest +MAINTAINER Ozrlz + +# Conf files +COPY odoo-nginx.conf /etc/nginx/conf.d/ + +# Delete default files +RUN rm /etc/nginx/conf.d/default.conf + +# Expose 8069 port, in which the users will interact with odoo services +EXPOSE 8069 \ No newline at end of file diff --git a/config/odoo.conf b/config/odoo.conf index 77af2fc..800ad79 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -11,14 +11,14 @@ db_port = 5432 db_sslmode = prefer db_template = template0 db_user = odoo -dbfilter = +dbfilter = demo = False email_from = hoanglong@spiderum.com geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb http_enable = True -http_interface = +http_interface = http_port = 8069 -import_partial = +import_partial = limit_memory_hard = 2684354560 limit_memory_soft = 2147483648 limit_request = 8192 @@ -30,16 +30,15 @@ log_db = False log_db_level = warning log_handler = :INFO log_level = info -logfile = +logfile = longpolling_port = 8072 -max_cron_threads = 2 osv_memory_age_limit = False osv_memory_count_limit = False -pg_path = -pidfile = -proxy_mode = False +pg_path = +pidfile = +proxy_mode = True reportgz = False -screencasts = +screencasts = screenshots = /tmp/odoo_tests server_wide_modules = base,web smtp_password = False @@ -49,12 +48,13 @@ smtp_ssl = False smtp_user = False syslog = False test_enable = False -test_file = +test_file = test_tags = None transient_age_limit = 1.0 translate_modules = ['all'] unaccent = False -upgrade_path = +upgrade_path = without_demo = True -workers = 0 - +workers = 6 +xmlrpc = True +max_cron_threads = 1 diff --git a/docker-compose.yml b/docker-compose.yml index 76d547c..f6a7123 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,9 @@ version: "3.1" services: - web_prod: + web: image: hglong16/odoo:latest depends_on: - db - ports: - - "8069:8069" - - "8070:8072" - - "8071:8071" volumes: - odoo-web-data:/var/lib/odoo - ./config:/etc/odoo @@ -39,12 +35,22 @@ services: PGADMIN_CONFIG_SERVER_MODE: 'False' volumes: - pgadmin:/var/lib/pgadmin - ports: - 5433:80 networks: - postgres restart: unless-stopped + proxy: + depends_on: + - web + container_name: odoo_proxy + build: + context: . + dockerfile: Dockerfile-nginx + ports: + - "8069:8069" + networks: + - postgres networks: postgres: @@ -55,5 +61,3 @@ volumes: odoo-web-data: odoo-db-data: pgadmin: - - diff --git a/odoo-nginx.conf b/odoo-nginx.conf new file mode 100644 index 0000000..e798fcd --- /dev/null +++ b/odoo-nginx.conf @@ -0,0 +1,56 @@ +# Define a server for odoo backend (port 8069, as configured on the odoo.conf file (odoo file) ) +upstream odoo-backend { + server web:8069; +} + +# Define a server for longpolling (port 8072, as configured on the odoo.conf file (odoo file) ) +upstream odoo-lp{ + server web:8072; +} + +server { + listen 8069; + server_name moron.merctrans.vn; + # Log files + access_log /var/log/nginx/odoo-access.log; + error_log /var/log/nginx/odoo-error.log; + + # Increase proxy buffer size + proxy_buffers 16 64k; + proxy_buffer_size 128k; + # Force timeouts if the backend dies + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; + # Enable data compression + gzip on; + gzip_min_length 1100; + gzip_buffers 4 32k; + gzip_types text/plain text/xml text/css text/less application/x-javascript application/xml application/json application/javascript; + gzip_vary on; + + # Proxy header and settings + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + + + # Cache static data + location ~* /web/static/ { + proxy_cache_valid 200 60m; + proxy_buffering on; + expires 864000; + proxy_pass http://odoo-backend; + } + + location / { + proxy_pass http://odoo-backend; + # The following makes the timeout broader + proxy_read_timeout 30000; + proxy_redirect off; + } + + location /longpolling { + proxy_pass http://odoo-lp; + } +} \ No newline at end of file diff --git a/odoo-nginx_ssl.conf b/odoo-nginx_ssl.conf new file mode 100644 index 0000000..d6a7a67 --- /dev/null +++ b/odoo-nginx_ssl.conf @@ -0,0 +1,60 @@ +# Define a server for odoo backend (port 8069, as configured on the odoo.conf file (odoo file) ) +upstream odoo-backend { + server web:8069; +} + +# Define a server for longpolling (port 8072, as configured on the odoo.conf file (odoo file) ) +upstream odoo-lp{ + server web:8072; +} + +server { + listen 8069; + server_name moron.mertrans.vn; + # Log files + access_log /var/log/nginx/odoo-access.log; + error_log /var/log/nginx/odoo-error.log; + # SSL + ssl on; + ssl_certificate /etc/nginx/ssl/cert.pem; + ssl_certificate_key /etc/nginx/ssl/key.pem; + keepalive_timeout 60; + # Proxy header and settings + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_redirect off; + + + # Increase proxy buffer size + proxy_buffers 16 64k; + proxy_buffer_size 128k; + # Force timeouts if the backend dies + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; + # Enable data compression + gzip on; + gzip_min_length 1100; + gzip_buffers 4 32k; + gzip_types text/plain text/xml text/css text/less application/x-javascript application/xml application/json application/javascript; + gzip_vary on; + + # Cache static data + location ~* /web/static/ { + proxy_cache_valid 200 60m; + proxy_buffering on; + expires 864000; + proxy_pass http://odoo-backend; + } + + location / { + proxy_pass http://odoo-backend; + # The following makes the timeout broader + proxy_read_timeout 30000; + proxy_redirect off; + } + + location /longpolling { + proxy_pass http://odoo-lp; + } +} \ No newline at end of file From b0e9e25fa8c050a891f30e4c0e40d7b1afab021e Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 12:04:20 +0700 Subject: [PATCH 074/112] 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 075/112] 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 From 244e6cf3cebd6ecc2e16a37f11ab58259de3b16f Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 17:02:24 +0700 Subject: [PATCH 076/112] delete Dockerfile-odoo --- Dockerfile | 91 ------------------------------------------------------ 1 file changed, 91 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 3b6025f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,91 +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 \ - && chown -R odoo /entrypoint.sh -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"] From f9105eb5afa73dd3ad03f7b983e3beaa5978d71c Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 17:05:15 +0700 Subject: [PATCH 077/112] delele conflic and modify odoo.conf --- config/odoo.conf | 4 ++-- local-addons/merctrans_projects/views/contributors.xml | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/config/odoo.conf b/config/odoo.conf index 800ad79..6520b82 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -55,6 +55,6 @@ translate_modules = ['all'] unaccent = False upgrade_path = without_demo = True +max_cron_threads = 2 workers = 6 -xmlrpc = True -max_cron_threads = 1 +; xmlrpc = True diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 6677bff..7f2bcea 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -28,15 +28,10 @@ -<<<<<<< HEAD -======= - - - ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac + From 0e0a3de0b21abbf440d2fd6f483f39c6f63c21e0 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 17:12:02 +0700 Subject: [PATCH 078/112] accept conflic --- local-addons/merctrans_projects/views/contributors.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 7f2bcea..5da44c8 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -16,11 +16,7 @@ -<<<<<<< HEAD -======= - ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac @@ -52,10 +48,7 @@ -<<<<<<< HEAD -======= ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac From f7b723be4e42aaebe44225b10c7aae007619d035 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 17:15:01 +0700 Subject: [PATCH 079/112] fix conflict --- .../merctrans_projects/views/contributors.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/local-addons/merctrans_projects/views/contributors.xml b/local-addons/merctrans_projects/views/contributors.xml index 6677bff..aceeaa9 100755 --- a/local-addons/merctrans_projects/views/contributors.xml +++ b/local-addons/merctrans_projects/views/contributors.xml @@ -16,11 +16,7 @@ -<<<<<<< HEAD -======= - ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac @@ -28,15 +24,9 @@ -<<<<<<< HEAD -======= - - - ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac @@ -57,10 +47,7 @@ -<<<<<<< HEAD -======= ->>>>>>> 37a21c0b9ccef2098ef98d76aa45bb8beb01adac From d725664d2fd1d21824c667764c20c671226fc018 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 17:28:22 +0700 Subject: [PATCH 080/112] add seicurity for account.contacts --- local-addons/merctrans_projects/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv index c818954..4f29c79 100755 --- a/local-addons/merctrans_projects/security/ir.model.access.csv +++ b/local-addons/merctrans_projects/security/ir.model.access.csv @@ -4,5 +4,6 @@ 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_accounts,merctransproject.accounts_default,model_account_contacts,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 From b44cea96ac374ab54fb1b210bf3b85c605d6b3cf Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 17:31:58 +0700 Subject: [PATCH 081/112] change Account Contacts to Contacts --- local-addons/merctrans_projects/views/clients.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 2b741b8..7d1edf4 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -8,7 +8,7 @@ - Account Contacts + Contacts account.contacts tree,form From 701403992b938f31b99216112743bb634b3c6ad1 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 18:04:46 +0700 Subject: [PATCH 082/112] add xmlrpc port 8069, fix bug polling --- config/odoo.conf | 3 ++- local-addons/merctrans_projects/views/projects_menus.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/odoo.conf b/config/odoo.conf index 6520b82..190ff6a 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -57,4 +57,5 @@ upgrade_path = without_demo = True max_cron_threads = 2 workers = 6 -; xmlrpc = True +xmlrpc_port = 8069 +xmlrpc = True diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index e5dc73f..258a7bd 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -211,7 +211,7 @@ - + From 6989322fd040be386183ebf69dbe395896d0c046 Mon Sep 17 00:00:00 2001 From: truong tang Date: Wed, 27 Jul 2022 18:22:30 +0700 Subject: [PATCH 083/112] fix source and target languages in projects and pos --- .../models/merctrans_pos.py | 24 +++++++++++++------ .../models/merctrans_projects.py | 6 ++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_pos.py b/local-addons/merctrans_projects/models/merctrans_pos.py index dd47eec..84ae830 100755 --- a/local-addons/merctrans_projects/models/merctrans_pos.py +++ b/local-addons/merctrans_projects/models/merctrans_pos.py @@ -21,6 +21,19 @@ class MerctransPOs(models.Model): payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), ('paid', 'Paid')] + + 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)')] # Detail po """ Field and API Decorate @@ -85,14 +98,11 @@ class MerctransPOs(models.Model): # NOTE: INHERIT FROM PROJECT - source_language = fields.Char('Source Language', - store=True, - compute='_get_project_source', - readonly=True) + source_language = fields.Selection(string="Source Languages", + selection=language_list) - target_language = fields.Char('Target Language', - readonly=True, - compute='_get_project_target') + target_language = fields.Selection(string="Target Language", + selection=language_list) currency_id = 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 b960b16..d575fe5 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -112,12 +112,10 @@ class MercTransProjects(models.Model): # NOTE: TARGET AND SOURCE LANGUAGE source_language = fields.Selection(string="Source Languages", - selection=language_list, - default="Select a language") + selection=language_list) target_language = fields.Selection(string="Target Language", - selection=language_list, - default="Select a language") + selection=language_list) # NOTE: TIME, START AND DUE DATE From ec58eaa3994c7a7d0a452f5d507c87ef45cbc8af Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 21:39:55 +0700 Subject: [PATCH 084/112] delete some view xml thua thai --- .../merctrans_projects/__manifest__.py | 2 +- .../views/projects_menus.xml | 120 +++++++++--------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index 12aee98..ba17b1b 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -35,9 +35,9 @@ 'security/ir.model.access.csv', # View <> 'views/pos.xml', - 'views/clients.xml', 'views/contributors.xml', 'views/projects_menus.xml', + 'views/clients.xml', 'views/templates.xml', # 'views/sale.xml', #data diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 258a7bd..6233fa9 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -234,56 +234,56 @@
- - Purchase Order Form - merctrans.pos - -
- - - - - - - - - - - - - - - - - - -
-
-
- + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Purchase Order Tree - merctrans.pos - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + - - + - - + - - + - - + - + From a7c41a4182a0b2e53b5f5481e55a72d16a501e54 Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 22:49:58 +0700 Subject: [PATCH 085/112] fix longpolling, by edit config nginx --- Dockerfile-nginx | 2 +- config/odoo.conf | 9 +++-- odoo-nginx.conf | 4 +- odoo-nginx_ssl.conf | 91 +++++++++++++++++++-------------------------- 4 files changed, 47 insertions(+), 59 deletions(-) diff --git a/Dockerfile-nginx b/Dockerfile-nginx index 4430534..37ab933 100644 --- a/Dockerfile-nginx +++ b/Dockerfile-nginx @@ -2,7 +2,7 @@ FROM nginx:latest MAINTAINER Ozrlz # Conf files -COPY odoo-nginx.conf /etc/nginx/conf.d/ +COPY odoo-nginx_ssl.conf /etc/nginx/conf.d/ # Delete default files RUN rm /etc/nginx/conf.d/default.conf diff --git a/config/odoo.conf b/config/odoo.conf index 190ff6a..3e998f5 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -20,10 +20,10 @@ http_interface = http_port = 8069 import_partial = limit_memory_hard = 2684354560 -limit_memory_soft = 2147483648 +limit_memory_soft = 2272469470 limit_request = 8192 -limit_time_cpu = 60 -limit_time_real = 120 +limit_time_cpu = 600 +limit_time_real = 1200 limit_time_real_cron = -1 list_db = False log_db = False @@ -56,6 +56,7 @@ unaccent = False upgrade_path = without_demo = True max_cron_threads = 2 -workers = 6 +workers = 5 xmlrpc_port = 8069 xmlrpc = True +xmlrpc_interface = 0.0.0.0 diff --git a/odoo-nginx.conf b/odoo-nginx.conf index e798fcd..7f65220 100644 --- a/odoo-nginx.conf +++ b/odoo-nginx.conf @@ -5,12 +5,13 @@ upstream odoo-backend { # Define a server for longpolling (port 8072, as configured on the odoo.conf file (odoo file) ) upstream odoo-lp{ - server web:8072; + server web:8070; } server { listen 8069; server_name moron.merctrans.vn; + rewrite ^(.*) https://$host$1 permanent; # Log files access_log /var/log/nginx/odoo-access.log; error_log /var/log/nginx/odoo-error.log; @@ -52,5 +53,6 @@ server { location /longpolling { proxy_pass http://odoo-lp; + proxy_read_timeout 30000; } } \ No newline at end of file diff --git a/odoo-nginx_ssl.conf b/odoo-nginx_ssl.conf index d6a7a67..b147b31 100644 --- a/odoo-nginx_ssl.conf +++ b/odoo-nginx_ssl.conf @@ -1,60 +1,45 @@ -# Define a server for odoo backend (port 8069, as configured on the odoo.conf file (odoo file) ) -upstream odoo-backend { - server web:8069; -} + upstream odoo { + server web:8069; + } -# Define a server for longpolling (port 8072, as configured on the odoo.conf file (odoo file) ) -upstream odoo-lp{ - server web:8072; -} + upstream odoochat { + server web:8072; + } -server { - listen 8069; - server_name moron.mertrans.vn; - # Log files - access_log /var/log/nginx/odoo-access.log; - error_log /var/log/nginx/odoo-error.log; - # SSL - ssl on; - ssl_certificate /etc/nginx/ssl/cert.pem; - ssl_certificate_key /etc/nginx/ssl/key.pem; - keepalive_timeout 60; - # Proxy header and settings - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_redirect off; + server { + listen 80; + server_name www.my_domain.com my_domain.com; + proxy_read_timeout 720s; + proxy_connect_timeout 720s; + proxy_send_timeout 720s; + # Proxy headers + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Real-IP $remote_addr; + access_log /var/log/nginx/odoo.access.log; + error_log /var/log/nginx/odoo.error.log; - # Increase proxy buffer size - proxy_buffers 16 64k; - proxy_buffer_size 128k; - # Force timeouts if the backend dies - proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; - # Enable data compression - gzip on; - gzip_min_length 1100; - gzip_buffers 4 32k; - gzip_types text/plain text/xml text/css text/less application/x-javascript application/xml application/json application/javascript; - gzip_vary on; + location /longpolling { + proxy_pass http://odoochat; + } - # Cache static data - location ~* /web/static/ { - proxy_cache_valid 200 60m; - proxy_buffering on; - expires 864000; - proxy_pass http://odoo-backend; - } + # Handle / requests + location / { + proxy_redirect off; + proxy_pass http://odoo; + } - location / { - proxy_pass http://odoo-backend; - # The following makes the timeout broader - proxy_read_timeout 30000; - proxy_redirect off; - } + # Cache static files + location ~* /web/static/ { + proxy_cache_valid 200 90m; + proxy_buffering on; + expires 864000; + proxy_pass http://odoo; + } - location /longpolling { - proxy_pass http://odoo-lp; - } -} \ No newline at end of file + # Gzip + gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; + gzip on; + } \ No newline at end of file From 2e92a6f4978075312491f590a20e12d2bba0536a Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 27 Jul 2022 23:00:33 +0700 Subject: [PATCH 086/112] increase timeout --- odoo-nginx_ssl.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/odoo-nginx_ssl.conf b/odoo-nginx_ssl.conf index b147b31..82992c5 100644 --- a/odoo-nginx_ssl.conf +++ b/odoo-nginx_ssl.conf @@ -9,9 +9,9 @@ server { listen 80; server_name www.my_domain.com my_domain.com; - proxy_read_timeout 720s; - proxy_connect_timeout 720s; - proxy_send_timeout 720s; + proxy_read_timeout 5000s; + proxy_connect_timeout 5000s; + proxy_send_timeout 5000s; # Proxy headers proxy_set_header X-Forwarded-Host $host; From 146b4220ba5c6fc3afec5a2dce0e1a3d7a179efb Mon Sep 17 00:00:00 2001 From: truong tang Date: Sat, 6 Aug 2022 15:46:08 +0700 Subject: [PATCH 087/112] add fields to clients, change client view, and fix email bug --- .../models/merctrans_clients.py | 52 ++++++++++++++++--- .../merctrans_projects/views/clients.xml | 12 ++++- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 63e72f9..17c0be9 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -13,7 +13,20 @@ class MerctransClient(models.Model): # 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='Account') + + payment_term_list = [('30 days', '30D'), + ('45 days', '45D'), + ('60 days', '60D'), + ('90 days', '90D')] + + payment_method_list = [('paypal', 'PayPal'), + ('wire transfer', 'Wire Transfer'), + ('payoneer', 'Payoneer')] + + name = fields.Char(string='Account Name*') + + client_short_name = fields.Char(string='Account ID*', readonly=True, compute='_get_client_id') + email = fields.Char(string='Email') country = fields.Many2one('res.country', string='Country') @@ -24,6 +37,18 @@ class MerctransClient(models.Model): website = fields.Char(string='Website') + services = fields.Many2many('merctrans.services', string = 'Services') + + sales_person = fields.Many2one('res.users', string='Salesperson') + + payment_term = fields.Selection(selection=payment_term_list, string='Payment Term') + + payment_method = fields.Selection(selection=payment_method_list, string='Payment Method') + + create_date = fields.Date(string='Create Date', readonly=True) + + write_date = fields.Datetime(string='Last Update', readonly=True) + project_history = fields.One2many('merctrans.projects', 'client', readonly=True) @@ -48,12 +73,25 @@ def check_duplicate_name(self): @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') + for client in self: + if client.email: + match = re.match( + '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', + client.email) + else: + match = "Not created" + if match is None: + raise ValidationError('Not a valid email') + + @api.onchange('name') + @api.depends('name') + def _get_client_id(self): + for client in self: + if client.name: + short_name = "".join(client.name.split()).upper() + else: + short_name = "DEFA" + client.client_short_name = f"{short_name[:4]}" class AccountContact(models.Model): diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 7d1edf4..9c6bb37 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -24,10 +24,18 @@ - + - + + + + + + + + + From 69a989bc6479a9728bc65412a4fad98859ea296e Mon Sep 17 00:00:00 2001 From: truong tang Date: Mon, 8 Aug 2022 15:33:24 +0700 Subject: [PATCH 088/112] fix clients --- local-addons/merctrans_projects/models/merctrans_clients.py | 4 ++-- 1 file 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 17c0be9..641c008 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -45,7 +45,7 @@ class MerctransClient(models.Model): payment_method = fields.Selection(selection=payment_method_list, string='Payment Method') - create_date = fields.Date(string='Create Date', readonly=True) + create_date = fields.Datetime(string='Create Date', readonly=True) write_date = fields.Datetime(string='Last Update', readonly=True) @@ -57,7 +57,7 @@ class MerctransClient(models.Model): 'invoice_client', readonly=True) # domain=[('invoice_status', '=', 'unpaid') # ]) - client_contact_list = fields.One2many('account.contacts','contact_account', readonly=True) + client_contact_list = fields.One2many('account.contacts','contact_account') # client_currency = fields.Many2one('res.currency', # string="Currency",) From ace8a08534f3fa5dc3097195135f5c4dffe73c1c Mon Sep 17 00:00:00 2001 From: hglong16 Date: Wed, 10 Aug 2022 16:57:18 +0700 Subject: [PATCH 089/112] fix conflic in origin --- Dockerfile-odoo | 10 ++++ config/odoo.conf | 51 +++++---------------- docker-compose.yml | 18 ++------ odoo-nginx_ssl.conf | 108 ++++++++++++++++++++++++++------------------ 4 files changed, 90 insertions(+), 97 deletions(-) create mode 100644 Dockerfile-odoo diff --git a/Dockerfile-odoo b/Dockerfile-odoo new file mode 100644 index 0000000..662306a --- /dev/null +++ b/Dockerfile-odoo @@ -0,0 +1,10 @@ +FROM hglong16/odoo:latest + +USER root + + +RUN pip3 install psycogreen zeep pstats_print2list simplejson plaid-python xlrd phonenumbers pyOpenSSL asn1crypto bcrypt boto3 botocore certifi cffi chardet cryptography docutils dropbox gevent greenlet idna jmespath paramiko pyasn1 pycparser pynacl pyocclient pysftp requests s3transfer urllib3 num2words pyldap qrcode vobject watchdog xlwt firebase-admin odoo_import_export_client + +USER odoo + +EXPOSE 8072 \ No newline at end of file diff --git a/config/odoo.conf b/config/odoo.conf index 3e998f5..2758152 100644 --- a/config/odoo.conf +++ b/config/odoo.conf @@ -11,52 +11,25 @@ db_port = 5432 db_sslmode = prefer db_template = template0 db_user = odoo -dbfilter = -demo = False -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 = 2272469470 +limit_memory_soft = 2147483648 limit_request = 8192 -limit_time_cpu = 600 -limit_time_real = 1200 -limit_time_real_cron = -1 -list_db = False -log_db = False -log_db_level = warning -log_handler = :INFO -log_level = info -logfile = +limit_time_cpu = 3600 +limit_time_real = 3600 +max_cron_threads = 2 +workers = 6 longpolling_port = 8072 -osv_memory_age_limit = False -osv_memory_count_limit = False -pg_path = -pidfile = -proxy_mode = True -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 -max_cron_threads = 2 -workers = 5 -xmlrpc_port = 8069 +list_db = True +dbfilter = .* xmlrpc = True -xmlrpc_interface = 0.0.0.0 +xmlrpc_port = 8069 +xmlrpcs = True +xmlrpc_interface = +netrpc_interface = +proxy_mode = True \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f6a7123..2772ed4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ version: "3.1" services: web: + container_name: odoo_web image: hglong16/odoo:latest depends_on: - db @@ -11,6 +12,9 @@ services: environment: - USER=odoo - PASSWORD=odoo + ports: + - "8069:8069" + - "8072:8072" networks: - postgres command: > @@ -34,29 +38,17 @@ services: PGADMIN_DEFAULT_PASSWORD: admin PGADMIN_CONFIG_SERVER_MODE: 'False' volumes: - - pgadmin:/var/lib/pgadmin + - pgadmin:/var/lib/pgadmin ports: - 5433:80 networks: - postgres restart: unless-stopped - proxy: - depends_on: - - web - container_name: odoo_proxy - build: - context: . - dockerfile: Dockerfile-nginx - ports: - - "8069:8069" - networks: - - postgres networks: postgres: driver: bridge - volumes: odoo-web-data: odoo-db-data: diff --git a/odoo-nginx_ssl.conf b/odoo-nginx_ssl.conf index 82992c5..a023747 100644 --- a/odoo-nginx_ssl.conf +++ b/odoo-nginx_ssl.conf @@ -1,45 +1,63 @@ - upstream odoo { - server web:8069; - } - - upstream odoochat { - server web:8072; - } - - server { - listen 80; - server_name www.my_domain.com my_domain.com; - proxy_read_timeout 5000s; - proxy_connect_timeout 5000s; - proxy_send_timeout 5000s; - - # Proxy headers - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Real-IP $remote_addr; - access_log /var/log/nginx/odoo.access.log; - error_log /var/log/nginx/odoo.error.log; - - location /longpolling { - proxy_pass http://odoochat; - } - - # Handle / requests - location / { - proxy_redirect off; - proxy_pass http://odoo; - } - - # Cache static files - location ~* /web/static/ { - proxy_cache_valid 200 90m; - proxy_buffering on; - expires 864000; - proxy_pass http://odoo; - } - - # Gzip - gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; - gzip on; - } \ No newline at end of file +# Define a server for odoo backend (port 8069, as configured on the odoo.conf file (odoo file) ) +upstream odoo-backend { + server web:8069; +} + +# Define a server for longpolling (port 8072, as configured on the odoo.conf file (odoo file) ) +upstream odoo-lp{ + server web:8072; +} + + +server { + listen 8069; + server_name moron.merctrans.vn; + # Log files + access_log /var/log/nginx/odoo-access.log; + error_log /var/log/nginx/odoo-error.log; + + + # Increase proxy buffer size + proxy_buffers 16 64k; + proxy_buffer_size 128k; + proxy_read_timeout 720s; + proxy_connect_timeout 720s; + proxy_send_timeout 720s; + # Force timeouts if the backend dies + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; + # Enable data compression + gzip on; + gzip_min_length 1100; + gzip_buffers 4 32k; + gzip_types text/plain text/xml text/css text/less application/x-javascript application/xml application/json application/javascript; + gzip_vary on; + + # Proxy header and settings + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Frame-Options SAMEORIGIN; + add_header X-Content-Type-Options nosniff; + + # Cache static data + location ~* /web/static/ { + proxy_cache_valid 200 60m; + proxy_buffering on; + expires 864000; + proxy_pass http://odoo-backend; + } + + location / { + proxy_pass http://odoo-backend; + # The following makes the timeout broader + proxy_read_timeout 30000; + proxy_redirect off; + } + + location /longpolling { + proxy_pass http://odoo-lp; + } +} \ No newline at end of file From 131830cbf2f289657c143eeb2ae5714e5d65c989 Mon Sep 17 00:00:00 2001 From: "joe.tang@yoose.com" Date: Thu, 18 Aug 2022 12:07:31 +0700 Subject: [PATCH 090/112] fix invoice --- .../models/merctrans_clients.py | 29 ++++++++++++++----- .../models/merctrans_invoices.py | 7 +++-- .../merctrans_projects/views/clients.xml | 5 ++-- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 641c008..156f04f 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -2,6 +2,13 @@ from odoo.exceptions import ValidationError from odoo import api, fields, models +class PaymentMethod(models.Model): + _name = 'merctrans.payments' + _rec_name = 'payment_term' + + payment_term = fields.Char(string='Payment Method', required=True) + + class MerctransClient(models.Model): @@ -57,7 +64,7 @@ class MerctransClient(models.Model): 'invoice_client', readonly=True) # domain=[('invoice_status', '=', 'unpaid') # ]) - client_contact_list = fields.One2many('account.contacts','contact_account') + client_contact_list = fields.One2many('account.contacts','contact_id') # client_currency = fields.Many2one('res.currency', # string="Currency",) @@ -93,6 +100,9 @@ def _get_client_id(self): short_name = "DEFA" client.client_short_name = f"{short_name[:4]}" + + + class AccountContact(models.Model): _name = 'account.contacts' @@ -100,7 +110,7 @@ class AccountContact(models.Model): _description = 'MercTrans Account Contact list' - contact_account = fields.Many2one('merctrans.clients', required=True) + contact_id = fields.Many2one('merctrans.clients', string='Account', required=True) contact_name = fields.Char(string='Name') contact_position = fields.Char(string='Position') contact_email = fields.Char(string='Email') @@ -109,9 +119,12 @@ class AccountContact(models.Model): @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 + for contact in self: + if contact.contact_email: + match = re.match( + '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', + contact.contact_email) + else: + contact.contact_email = "N/A" + if match is None: + raise ValidationError('Not a valid email') diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 824418f..8f21568 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -20,15 +20,16 @@ class MercTransInvoices(models.Model): 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_name = fields.Char('Invoice #', compute="_get_invoice_name") + invoice_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) + invoice_due_date = fields.Date(string='Due Date*', required=True) 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", + invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") 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 9c6bb37..8028be7 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -44,6 +44,7 @@ + @@ -95,7 +96,7 @@ account.contacts - + @@ -113,7 +114,7 @@
- + From c8e197ec2d006e69c51044711a68480519b70737 Mon Sep 17 00:00:00 2001 From: truongtang Date: Thu, 18 Aug 2022 16:24:14 +0700 Subject: [PATCH 091/112] fix a typo so commit to master --- local-addons/merctrans_projects/models/merctrans_invoices.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 8f21568..1990154 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -76,3 +76,5 @@ def sync_status(self): project.write({'payment_status': 'paid'}) if self.invoice_status == 'invoiced': project.write({'payment_status': 'invoiced'}) + if self.invoice_status == 'unpaid': + project.write({'payment_status': 'unpaid'}) From 7dd9b59c50778937b2410dcb3c196515cc380f30 Mon Sep 17 00:00:00 2001 From: truongtang Date: Tue, 23 Aug 2022 09:36:52 +0700 Subject: [PATCH 092/112] fix invoices, add more fields, validation for fields --- .../models/merctrans_invoices.py | 36 +++++++++++++++++-- .../views/projects_menus.xml | 7 ++-- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 1990154..dbf01dc 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -20,20 +20,35 @@ class MercTransInvoices(models.Model): readonly=True, default=lambda self: self.env['ir.sequence']. next_by_code('increment_invoice_id')) - invoice_name = fields.Char('Invoice #', compute="_get_invoice_name") + invoice_name = fields.Char(string='Invoice #', compute="_get_invoice_name") invoice_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) invoice_due_date = fields.Date(string='Due Date*', required=True) invoice_client = fields.Many2one('merctrans.clients', string='Client', required='True') + client_name = fields.Char(compute="_get_invoice_client") + invoice_details_ids = fields.Many2many('merctrans.projects', - string='Invoice Lines') + string='Invoice Lines', domain=[('payment_status','=', 'unpaid')]) currency_id = fields.Many2one('res.currency', string='Currency') invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") invoice_status = fields.Selection(string="Invoice Status", selection=status_list, - default='Unpaid') + default='unpaid') + + + + @api.depends('invoice_client') + @api.onchange('invoice_client') + def _get_invoice_client(self): + self.client_name = '' + for inv in self: + if inv.invoice_client: + inv.client_name += inv.invoice_client.name + else: + inv.client_name = 'default' + @api.depends('invoice_client', 'invoice_id') @api.onchange('invoice_client', 'invoice_id') @@ -59,6 +74,13 @@ def currency_constrains(self): raise ValidationError( 'Job currency must be the same as invoice currency!') + @api.constrains('invoice_details_ids', 'invoice_client') + def client_constrains(self): + for inv in self: + for job in inv.invoice_details_ids: + if inv.client_name != job.client_name: + raise ValidationError('You can only include jobs from the same client!') + # @api.model # def create(self, vals): # print("Invoices Create Vals ", vals) @@ -78,3 +100,11 @@ def sync_status(self): project.write({'payment_status': 'invoiced'}) if self.invoice_status == 'unpaid': project.write({'payment_status': 'unpaid'}) + if not self.invoice_status: + project.write({'payment_status': 'unpaid'}) + + @api.ondelete(at_uninstall=False) + def _check_invoice_status(self): + for rec in self: + if rec.invoice_status: + raise ValidationError("You cannot delete an invoice with invoice status set!") \ No newline at end of file diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 6233fa9..ff397e2 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -72,10 +72,12 @@ + + - + @@ -132,6 +134,7 @@ + @@ -212,7 +215,7 @@ - + From ef4dabf0a2abcbcbad1d8cc290a30915d6145003 Mon Sep 17 00:00:00 2001 From: truongtang Date: Thu, 25 Aug 2022 14:16:50 +0700 Subject: [PATCH 093/112] fix percentage in discount fields --- .../models/merctrans_invoices.py | 10 +++++++++- .../models/merctrans_projects.py | 4 +++- .../merctrans_projects/views/projects_menus.xml | 16 ++++++++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index dbf01dc..6e017cd 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -20,6 +20,7 @@ class MercTransInvoices(models.Model): readonly=True, default=lambda self: self.env['ir.sequence']. next_by_code('increment_invoice_id')) + sender_info = fields.Text(string='Sender Info*') invoice_name = fields.Char(string='Invoice #', compute="_get_invoice_name") invoice_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) invoice_due_date = fields.Date(string='Due Date*', required=True) @@ -36,7 +37,14 @@ class MercTransInvoices(models.Model): invoice_status = fields.Selection(string="Invoice Status", selection=status_list, default='unpaid') - + discount = fields.Integer(string='Discount (%)', default=0) + invoice_total = fields.Float('Total', compute="_compute_invoice_total", store=True, readonly=True, default=0) + + @api.onchange('invoice_total') + @api.depends('invoice_value', 'invoice_total', 'discount') + def _compute_invoice_total(self): + for invoice in self: + invoice.invoice_total = (100 - invoice.discount) / 100 * invoice.invoice_value @api.depends('invoice_client') diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index d575fe5..a60a65b 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -131,7 +131,7 @@ class MercTransProjects(models.Model): # 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 @@ -173,6 +173,8 @@ class MercTransProjects(models.Model): required=True, default='in progress') + client_po_number = fields.Char(string='Client PO Number') + payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, required=True, diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index ff397e2..de15bde 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -48,7 +48,10 @@ + + + @@ -69,6 +72,7 @@ + @@ -77,19 +81,22 @@ - + + - + - + + + @@ -144,7 +151,7 @@ - + @@ -152,6 +159,7 @@ + From e698d5b16be115329d9fc059a8461cab44b06537 Mon Sep 17 00:00:00 2001 From: truongtang Date: Fri, 26 Aug 2022 15:41:15 +0700 Subject: [PATCH 094/112] fix invoices and invoice view --- .../models/merctrans_invoices.py | 25 ++++++++++++++++++- .../views/projects_menus.xml | 3 ++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 6e017cd..2b8dec1 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -30,7 +30,7 @@ class MercTransInvoices(models.Model): client_name = fields.Char(compute="_get_invoice_client") invoice_details_ids = fields.Many2many('merctrans.projects', - string='Invoice Lines', domain=[('payment_status','=', 'unpaid')]) + string='Invoice Lines') currency_id = fields.Many2one('res.currency', string='Currency') invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") @@ -39,6 +39,8 @@ class MercTransInvoices(models.Model): default='unpaid') discount = fields.Integer(string='Discount (%)', default=0) invoice_total = fields.Float('Total', compute="_compute_invoice_total", store=True, readonly=True, default=0) + invoice_paid_date = fields.Date(string='Paid Date', default=datetime.today()) + @api.onchange('invoice_total') @api.depends('invoice_value', 'invoice_total', 'discount') @@ -89,6 +91,27 @@ def client_constrains(self): if inv.client_name != job.client_name: raise ValidationError('You can only include jobs from the same client!') + + @api.constrains('invoice_paid_date','invoice_date', 'invoice_status') + def paid_date_constrains(self): + for inv in self: + if inv.invoice_paid_date and inv.invoice_paid_date < inv.invoice_date: + raise ValidationError('Invoice paid date cannot be before invoice due date') + if inv.invoice_status != 'paid' and inv.invoice_paid_date: + raise ValidationError('Cannot have paid date when status is not Paid') + + @api.constrains('invoice_details_ids') + def invoice_detail_constrains(self): + for inv in self: + if not inv.invoice_details_ids: + raise ValidationError('Invoice must have at least one project!') + + @api.constrains('invoice_details_ids', 'invoice_status') + def invoice_status_constrains(self): + for inv in self: + if not inv.invoice_details_ids and inv.invoice_status: + raise ValidationError('Cannot set invoice status when there is no job!') + # @api.model # def create(self, vals): # print("Invoices Create Vals ", vals) diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index de15bde..3748910 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -90,7 +90,7 @@ - + @@ -98,6 +98,7 @@ + From ba4bf7ba7baae02e1770480faa28adb754399d50 Mon Sep 17 00:00:00 2001 From: truongtang Date: Tue, 20 Sep 2022 16:16:13 +0700 Subject: [PATCH 095/112] sale order created --- .../models/merctrals_sale_orders.py | 121 ++++++++++++++++++ .../models/merctrans_projects.py | 1 + 2 files changed, 122 insertions(+) create mode 100644 local-addons/merctrans_projects/models/merctrals_sale_orders.py diff --git a/local-addons/merctrans_projects/models/merctrals_sale_orders.py b/local-addons/merctrans_projects/models/merctrals_sale_orders.py new file mode 100644 index 0000000..6d46629 --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrals_sale_orders.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from odoo.exceptions import ValidationError + +from odoo import api, fields, models + + +class MercTransSaleOrder(models.Model): + _name = 'merctrans.so' + _rec_name = 'sale_order_name' + _description = 'MercTrans Sale Orders for Project Managers' + + status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), + ('unpaid', 'Unpaid')] + + sale_order_id = fields.Integer('Invoice ID', + index=True, + store=True, + readonly=True, + default=lambda self: self.env['ir.sequence']. + next_by_code('increment_invoice_id')) + sale_order_name = fields.Char(string='Sale Order #', compute="_get_sale_order_name") + sale_order_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) + sale_order_due_date = fields.Date(string='Due Date*', required=True) + sale_order_client = fields.Many2one('merctrans.clients', + string='Client', + required='True') + client_name = fields.Char(compute="_get_invoice_client") + + sale_order_job = fields.Many2one('merctrans.projects', + string='Sale Order Job') + currency_id = fields.Many2one('res.currency', string='Currency') + sale_order_value = fields.Float("Sub Total", + compute="_compute_invoice_value") + sale_order_status = fields.Selection(string="Invoice Status", + selection=status_list, + default='unpaid') + sale_order_total = fields.Float('Total', compute="_compute_sale_order_total", store=True, readonly=True, default=0) + + + @api.onchange('sale_order_total') + @api.depends('invoice_value', 'invoice_total', 'discount') + def _compute_invoice_total(self): + for sale_order in self: + sale_order.sale_order_total = (100 - invoice.discount) / 100 * invoice.invoice_value + + + @api.depends('invoice_client') + @api.onchange('invoice_client') + def _get_invoice_client(self): + self.client_name = '' + for inv in self: + if inv.invoice_client: + inv.client_name += inv.invoice_client.name + else: + inv.client_name = 'default' + + + @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.constrains('invoice_paid_date','invoice_date', 'invoice_status') + def paid_date_constrains(self): + for inv in self: + if inv.invoice_paid_date and inv.invoice_paid_date < inv.invoice_date: + raise ValidationError('Invoice paid date cannot be before invoice due date') + if inv.invoice_status != 'paid' and inv.invoice_paid_date: + raise ValidationError('Cannot have paid date when status is not Paid') + + @api.constrains('invoice_details_ids') + def invoice_detail_constrains(self): + for inv in self: + if not inv.invoice_details_ids: + raise ValidationError('Invoice must have at least one project!') + + @api.constrains('invoice_details_ids', 'invoice_status') + def invoice_status_constrains(self): + for inv in self: + if not inv.invoice_details_ids and inv.invoice_status: + raise ValidationError('Cannot set invoice status when there is no job!') + + # @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'}) + # if self.invoice_status == 'unpaid': + # project.write({'payment_status': 'unpaid'}) + # if not self.invoice_status: + # project.write({'payment_status': 'unpaid'}) + # + # @api.ondelete(at_uninstall=False) + # def _check_invoice_status(self): + # for rec in self: + # if rec.invoice_status: + # raise ValidationError("You cannot delete an invoice with invoice status set!") \ 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 a60a65b..5b49f11 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -178,6 +178,7 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, required=True, + readonly=True, default='unpaid') po_details = fields.One2many("merctrans.pos", From 24b0446710507fb60a21acb9cbd823fa19059504 Mon Sep 17 00:00:00 2001 From: svseas Date: Fri, 7 Oct 2022 17:40:32 +0700 Subject: [PATCH 096/112] fix invoice --- .../models/merctrals_sale_orders.py | 121 ------------------ 1 file changed, 121 deletions(-) delete mode 100644 local-addons/merctrans_projects/models/merctrals_sale_orders.py diff --git a/local-addons/merctrans_projects/models/merctrals_sale_orders.py b/local-addons/merctrans_projects/models/merctrals_sale_orders.py deleted file mode 100644 index 6d46629..0000000 --- a/local-addons/merctrans_projects/models/merctrals_sale_orders.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -from datetime import datetime - -from odoo.exceptions import ValidationError - -from odoo import api, fields, models - - -class MercTransSaleOrder(models.Model): - _name = 'merctrans.so' - _rec_name = 'sale_order_name' - _description = 'MercTrans Sale Orders for Project Managers' - - status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), - ('unpaid', 'Unpaid')] - - sale_order_id = fields.Integer('Invoice ID', - index=True, - store=True, - readonly=True, - default=lambda self: self.env['ir.sequence']. - next_by_code('increment_invoice_id')) - sale_order_name = fields.Char(string='Sale Order #', compute="_get_sale_order_name") - sale_order_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) - sale_order_due_date = fields.Date(string='Due Date*', required=True) - sale_order_client = fields.Many2one('merctrans.clients', - string='Client', - required='True') - client_name = fields.Char(compute="_get_invoice_client") - - sale_order_job = fields.Many2one('merctrans.projects', - string='Sale Order Job') - currency_id = fields.Many2one('res.currency', string='Currency') - sale_order_value = fields.Float("Sub Total", - compute="_compute_invoice_value") - sale_order_status = fields.Selection(string="Invoice Status", - selection=status_list, - default='unpaid') - sale_order_total = fields.Float('Total', compute="_compute_sale_order_total", store=True, readonly=True, default=0) - - - @api.onchange('sale_order_total') - @api.depends('invoice_value', 'invoice_total', 'discount') - def _compute_invoice_total(self): - for sale_order in self: - sale_order.sale_order_total = (100 - invoice.discount) / 100 * invoice.invoice_value - - - @api.depends('invoice_client') - @api.onchange('invoice_client') - def _get_invoice_client(self): - self.client_name = '' - for inv in self: - if inv.invoice_client: - inv.client_name += inv.invoice_client.name - else: - inv.client_name = 'default' - - - @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.constrains('invoice_paid_date','invoice_date', 'invoice_status') - def paid_date_constrains(self): - for inv in self: - if inv.invoice_paid_date and inv.invoice_paid_date < inv.invoice_date: - raise ValidationError('Invoice paid date cannot be before invoice due date') - if inv.invoice_status != 'paid' and inv.invoice_paid_date: - raise ValidationError('Cannot have paid date when status is not Paid') - - @api.constrains('invoice_details_ids') - def invoice_detail_constrains(self): - for inv in self: - if not inv.invoice_details_ids: - raise ValidationError('Invoice must have at least one project!') - - @api.constrains('invoice_details_ids', 'invoice_status') - def invoice_status_constrains(self): - for inv in self: - if not inv.invoice_details_ids and inv.invoice_status: - raise ValidationError('Cannot set invoice status when there is no job!') - - # @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'}) - # if self.invoice_status == 'unpaid': - # project.write({'payment_status': 'unpaid'}) - # if not self.invoice_status: - # project.write({'payment_status': 'unpaid'}) - # - # @api.ondelete(at_uninstall=False) - # def _check_invoice_status(self): - # for rec in self: - # if rec.invoice_status: - # raise ValidationError("You cannot delete an invoice with invoice status set!") \ No newline at end of file From 54d4a04a407d365ded61a3c3d802050a7f134966 Mon Sep 17 00:00:00 2001 From: svseas Date: Fri, 7 Oct 2022 19:06:23 +0700 Subject: [PATCH 097/112] create sale order --- .../merctrans_projects/models/__init__.py | 2 +- .../models/merctrans_projects.py | 2 +- .../models/merctrans_sale.py | 23 ++++++++ .../views/projects_menus.xml | 7 +++ .../merctrans_projects/views/sale.xml | 54 +++++++++++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 local-addons/merctrans_projects/models/merctrans_sale.py create mode 100644 local-addons/merctrans_projects/views/sale.xml diff --git a/local-addons/merctrans_projects/models/__init__.py b/local-addons/merctrans_projects/models/__init__.py index 542f40f..b5b2d8b 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, merctrans_contributors +from . import merctrans_clients, merctrans_pos, merctrans_projects, merctrans_invoices, merctrans_contributors, merctrans_sale diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 5b49f11..b5dba1a 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -184,7 +184,7 @@ class MercTransProjects(models.Model): po_details = fields.One2many("merctrans.pos", "project_id", string="Purchase Orders in this Project") - + so_details = fields.One2many("merctrans.sale","project_id", string="Sale Orders in this Project") # NOTE: FUNCTION AND API DECORATE def _get_client_name(self): diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py new file mode 100644 index 0000000..4427484 --- /dev/null +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from odoo.exceptions import ValidationError + +from odoo import api, fields, models + + +class MercTransInvoices(models.Model): + _name = 'merctrans.sale' + _rec_name = 'sale_order_name' + _description = 'MercTrans Sale Orders for Project Managers' + + status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), + ('unpaid', 'Unpaid')] + + project_id = fields.Many2one('merctrans.projects', + string="Project", + store=True) + sale_order_name = fields.Char(string="Sale Order") + + + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 3748910..26fc3eb 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -207,6 +207,13 @@ + + + + + + + diff --git a/local-addons/merctrans_projects/views/sale.xml b/local-addons/merctrans_projects/views/sale.xml new file mode 100644 index 0000000..e5ef350 --- /dev/null +++ b/local-addons/merctrans_projects/views/sale.xml @@ -0,0 +1,54 @@ + + + + Merctrans Sale Order List + merctrans.sale_order + tree,form + + + + + + Sale Order Form + merctrans.sale + +
+ + + + + + + + + + + +
+
+
+ + + + Purchase Order Tree + merctrans.sale + + + + + + + + + + + + + Purchase Order Search + merctrans.sale + + + + + +
From d7424884d662bafa26a35fd3364f3296b30ce527 Mon Sep 17 00:00:00 2001 From: svseas Date: Fri, 7 Oct 2022 22:08:53 +0700 Subject: [PATCH 098/112] fix sale order-auto populate --- .../merctrans_projects/__manifest__.py | 2 +- .../models/merctrans_projects.py | 10 +++ .../models/merctrans_sale.py | 61 ++++++++++++++++++- .../views/projects_menus.xml | 7 ++- .../merctrans_projects/views/sale.xml | 7 ++- 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index ba17b1b..5faa2b1 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -39,7 +39,7 @@ 'views/projects_menus.xml', 'views/clients.xml', 'views/templates.xml', - # 'views/sale.xml', + 'views/sale.xml', #data 'data/currencies.xml' ], diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index b5dba1a..eb6a620 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -252,3 +252,13 @@ def _compute_margin(self): project.project_margin = ( project.project_value - project.total_po_value) / project.project_value + + # @api.onchange('client') + # def sync_client(self): + # for sale_order in self.so_details: + # if sale_order: + # sale_order.write({'client' : self.client_name}, + # {'client_po_number': self.client_po_number}, + # {'sale_rate': self.sale_rate}) + + # project.write({'payment_status': 'unpaid'}) diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index 4427484..d11c71f 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -4,7 +4,15 @@ from odoo.exceptions import ValidationError from odoo import api, fields, models - +# +# +# +# +# +# +# +# +# class MercTransInvoices(models.Model): _name = 'merctrans.sale' @@ -17,7 +25,56 @@ class MercTransInvoices(models.Model): project_id = fields.Many2one('merctrans.projects', string="Project", store=True) - sale_order_name = fields.Char(string="Sale Order") + sale_order_name = fields.Char(string="Sale Order Name") + + client = fields.Char(string='Client', + readonly=True, + compute = "_get_client_name") + + client_po_number = fields.Char(string='Client PO number', + readonly=True, + compute="_get_client_po_number") + + sale_order_volume = fields.Integer(string='Volume*', + required=True, + default=0) + + sale_rate = fields.Float(string='Rate*', + readonly=True, + compute="_get_sale_rate") + + currency_id = fields.Char(string='Currency', + readonly=True, + compute="_get_currency_id") + + + # The next section is to automatically populate field when a project is selected. + @api.onchange('project_id') + @api.depends('project_id') + def _get_client_name(self): + for sale_order in self: + if sale_order.project_id.client_name: + sale_order.client = sale_order.project_id.client_name + @api.onchange('project_id') + @api.depends('project_id') + def _get_client_po_number(self): + for sale_order in self: + if sale_order.project_id.client_po_number: + sale_order.client_po_number = sale_order.project_id.client_po_number + else: + sale_order.client_po_number = " " + @api.onchange('project_id') + @api.depends('project_id') + def _get_currency_id(self): + for sale_order in self: + if sale_order.project_id.currency_id: + sale_order.currency_id = sale_order.project_id.currency_id + @api.onchange('project_id') + @api.depends('project_id') + def _get_sale_rate(self): + for sale_order in self: + if sale_order.project_id.sale_rate: + sale_order.sale_rate = sale_order.project_id.sale_rate diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 26fc3eb..158f030 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -142,7 +142,7 @@ - + @@ -211,6 +211,11 @@ + + + + + diff --git a/local-addons/merctrans_projects/views/sale.xml b/local-addons/merctrans_projects/views/sale.xml index e5ef350..88c9cc5 100644 --- a/local-addons/merctrans_projects/views/sale.xml +++ b/local-addons/merctrans_projects/views/sale.xml @@ -2,12 +2,13 @@ Merctrans Sale Order List - merctrans.sale_order + merctrans.sale tree,form - - + + + Sale Order Form merctrans.sale From 3bc96dbcfa6135deec0ad38fb93f428012dcdc20 Mon Sep 17 00:00:00 2001 From: svseas Date: Sun, 9 Oct 2022 10:16:18 +0700 Subject: [PATCH 099/112] fix sale module --- .../models/merctrans_invoices.py | 51 +++++++++------ .../models/merctrans_projects.py | 45 +++++++++++++- .../models/merctrans_sale.py | 62 +++++++++++++++---- .../views/projects_menus.xml | 35 +++++++++-- .../merctrans_projects/views/sale.xml | 19 ++++-- 5 files changed, 168 insertions(+), 44 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 2b8dec1..f80c2b6 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -20,25 +20,38 @@ class MercTransInvoices(models.Model): readonly=True, default=lambda self: self.env['ir.sequence']. next_by_code('increment_invoice_id')) + sender_info = fields.Text(string='Sender Info*') + invoice_name = fields.Char(string='Invoice #', compute="_get_invoice_name") + invoice_date = fields.Date(string='Issue Date*', default=datetime.today(), required=True) + invoice_due_date = fields.Date(string='Due Date*', required=True) + invoice_client = fields.Many2one('merctrans.clients', string='Client', required='True') + client_name = fields.Char(compute="_get_invoice_client") - invoice_details_ids = fields.Many2many('merctrans.projects', + + invoice_details_ids = fields.Many2many('merctrans.sale', string='Invoice Lines') + currency_id = fields.Many2one('res.currency', string='Currency') + invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") + invoice_status = fields.Selection(string="Invoice Status", selection=status_list, default='unpaid') + discount = fields.Integer(string='Discount (%)', default=0) + invoice_total = fields.Float('Total', compute="_compute_invoice_total", store=True, readonly=True, default=0) + invoice_paid_date = fields.Date(string='Paid Date', default=datetime.today()) @@ -121,21 +134,21 @@ def invoice_status_constrains(self): # 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'}) - if self.invoice_status == 'unpaid': - project.write({'payment_status': 'unpaid'}) - if not self.invoice_status: - project.write({'payment_status': 'unpaid'}) - - @api.ondelete(at_uninstall=False) - def _check_invoice_status(self): - for rec in self: - if rec.invoice_status: - raise ValidationError("You cannot delete an invoice with invoice status set!") \ No newline at end of file + # @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'}) + # if self.invoice_status == 'unpaid': + # project.write({'payment_status': 'unpaid'}) + # if not self.invoice_status: + # project.write({'payment_status': 'unpaid'}) + # + # @api.ondelete(at_uninstall=False) + # def _check_invoice_status(self): + # for rec in self: + # if rec.invoice_status: + # raise ValidationError("You cannot delete an invoice with invoice status set!") \ 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 eb6a620..10c57f8 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -61,7 +61,9 @@ class MercTransProjects(models.Model): ('delivered', 'Delivered'), ('canceled', 'Canceled')] - payment_status_list = [('unpaid', 'Unpaid'), ('invoiced', 'Invoiced'), + payment_status_list = [('unpaid', 'Unpaid'), + ('invoiced', 'Invoiced'), + ('partly paid', 'Partly Paid'), ('paid', 'Paid')] # number_id = fields.Integer(string="Stt", @@ -151,6 +153,11 @@ class MercTransProjects(models.Model): store=True, readonly=True, default=0) + project_paid = fields.Float("Amount Paid", + compute="_compute_paid", + readonly=True, + store=True, + default=0) total_po_value = fields.Float("Total PO value", compute="_compute_po_value", @@ -177,9 +184,10 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, + default='unpaid', required=True, readonly=True, - default='unpaid') + store=True) po_details = fields.One2many("merctrans.pos", "project_id", @@ -253,6 +261,39 @@ def _compute_margin(self): project.project_value - project.total_po_value) / project.project_value + @api.constrains('currency_id', 'so_details') + def currency_constrains(self): + for sale_order in self.so_details: + if sale_order.currency_id != self.currency_id: + raise ValidationError('Currency must be the same!') + + @api.constrains('currency_id', 'so_details') + def total_value_constrains(self): + total = 0 + for sale_oder in self.so_details: + total = total + sale_oder.value + if total > self.project_value: + raise ValidationError('Total Sale Orer Value must be smaller or equal to Project Value!') + + @api.depends('so_details') + def _compute_paid(self): + for project in self: + project.project_paid = 0 + for sale_order in self.so_details: + if sale_order.status == 'paid': + project.project_paid += sale_order.value + + @api.onchange('project_paid', 'project_value') + def change_status(self): + for project in self: + if project.project_paid == 0 and project.project_value == 0: + project.write({'payment_status': 'unpaid'}) + if 0 < project.project_paid < project.project_value: + project.write({'payment_status': 'partly paid'}) + if project.project_paid == project.project_value and project.project_value != 0: + project.write({'payment_status': 'paid'}) + + # @api.onchange('client') # def sync_client(self): # for sale_order in self.so_details: diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index d11c71f..affa605 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -27,6 +27,10 @@ class MercTransInvoices(models.Model): store=True) sale_order_name = fields.Char(string="Sale Order Name") + status = fields.Selection(string="Sale Order Status", + selection=status_list, + default='unpaid') + client = fields.Char(string='Client', readonly=True, compute = "_get_client_name") @@ -35,18 +39,27 @@ class MercTransInvoices(models.Model): readonly=True, compute="_get_client_po_number") - sale_order_volume = fields.Integer(string='Volume*', - required=True, - default=0) + volume = fields.Integer(string='Volume*', + required=True, + compute="_get_volume", + inverse="_inverse_get_volume", + store=True) sale_rate = fields.Float(string='Rate*', readonly=True, compute="_get_sale_rate") - currency_id = fields.Char(string='Currency', - readonly=True, - compute="_get_currency_id") + currency_id = fields.Many2one('res.currency', + string='Currency*', + required=True) + + discount = fields.Integer(string='Discount (%)', + compute="_get_discount", + inverse="_inverse_get_discount") + value = fields.Float(string="Sale Order Value", + readonly=True, + compute="_compute_sale_order_value") # The next section is to automatically populate field when a project is selected. @api.onchange('project_id') @@ -55,6 +68,8 @@ def _get_client_name(self): for sale_order in self: if sale_order.project_id.client_name: sale_order.client = sale_order.project_id.client_name + else: + sale_order.client = " " @api.onchange('project_id') @api.depends('project_id') @@ -67,14 +82,37 @@ def _get_client_po_number(self): @api.onchange('project_id') @api.depends('project_id') - def _get_currency_id(self): + def _get_sale_rate(self): for sale_order in self: - if sale_order.project_id.currency_id: - sale_order.currency_id = sale_order.project_id.currency_id + if sale_order.project_id.sale_rate: + sale_order.sale_rate = sale_order.project_id.sale_rate + else: + sale_order.sale_rate = 0 @api.onchange('project_id') @api.depends('project_id') - def _get_sale_rate(self): + def _get_volume(self): for sale_order in self: - if sale_order.project_id.sale_rate: - sale_order.sale_rate = sale_order.project_id.sale_rate + if sale_order.project_id.volume: + sale_order.volume = sale_order.project_id.volume + else: + sale_order.volume = 0 + + def _inverse_get_volume(self): + return + + @api.onchange('project_id') + @api.depends('project_id') + def _get_discount(self): + for sale_order in self: + if sale_order.project_id.discount: + sale_order.discount = sale_order.project_id.discount + + def _inverse_get_discount(self): + return + + @api.onchange('volume', 'sale_rate') + @api.depends('volume', 'sale_rate', 'discount') + def _compute_sale_order_value(self): + for sale_order in self: + sale_order.value = (100 - sale_order.discount) / 100 * sale_order.volume * sale_order.sale_rate diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 158f030..e66b076 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -84,14 +84,14 @@ - + - - + + - + @@ -161,7 +161,8 @@ - + + @@ -213,10 +214,32 @@ - + + + +
+
+ + + + + + + + + + + + + + + + + +
diff --git a/local-addons/merctrans_projects/views/sale.xml b/local-addons/merctrans_projects/views/sale.xml index 88c9cc5..b033132 100644 --- a/local-addons/merctrans_projects/views/sale.xml +++ b/local-addons/merctrans_projects/views/sale.xml @@ -18,12 +18,16 @@ - + + - - - + + + + + +
@@ -37,7 +41,12 @@ - + + + + + +
From 5ad89c233ee6338cad604e04cedd64ad5c8105e4 Mon Sep 17 00:00:00 2001 From: svseas Date: Sun, 9 Oct 2022 14:21:42 +0700 Subject: [PATCH 100/112] fix status sync and on delete change --- .../models/merctrans_invoices.py | 44 +++++++++---------- .../models/merctrans_projects.py | 19 +++++--- .../models/merctrans_sale.py | 14 ++++-- .../views/projects_menus.xml | 11 ++--- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index f80c2b6..bbadd52 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -84,10 +84,15 @@ def _get_invoice_name(self): inv.invoice_name = f"INV{inv.invoice_id:05d}-{cl_name[:4]}-{fields.Date.today().strftime('%y%m%d')}" @api.depends('invoice_details_ids') + @api.onchange('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) + item.invoice_value = 0 + for line in item.invoice_details_ids: + if line.value: + item.invoice_value += line.value + else: + item.invoice_value = 0 @api.constrains('invoice_details_ids', 'currency_id') def currency_constrains(self): @@ -100,8 +105,8 @@ def currency_constrains(self): @api.constrains('invoice_details_ids', 'invoice_client') def client_constrains(self): for inv in self: - for job in inv.invoice_details_ids: - if inv.client_name != job.client_name: + for sale_order in inv.invoice_details_ids: + if inv.client_name != sale_order.client: raise ValidationError('You can only include jobs from the same client!') @@ -134,21 +139,16 @@ def invoice_status_constrains(self): # 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'}) - # if self.invoice_status == 'unpaid': - # project.write({'payment_status': 'unpaid'}) - # if not self.invoice_status: - # project.write({'payment_status': 'unpaid'}) - # - # @api.ondelete(at_uninstall=False) - # def _check_invoice_status(self): - # for rec in self: - # if rec.invoice_status: - # raise ValidationError("You cannot delete an invoice with invoice status set!") \ No newline at end of file + @api.onchange('invoice_status') + def sync_status(self): + + for sale_order in self.invoice_details_ids: + if self.invoice_status == 'paid': + sale_order.write({'status': 'paid'}) + if self.invoice_status == 'invoiced': + sale_order.write({'status': 'invoiced'}) + if self.invoice_status == 'unpaid': + sale_order.write({'status': 'unpaid'}) + if not self.invoice_status: + sale_order.write({'status': 'unpaid'}) + diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 10c57f8..b170243 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -185,7 +185,7 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, default='unpaid', - required=True, + # required=True, readonly=True, store=True) @@ -267,15 +267,16 @@ def currency_constrains(self): if sale_order.currency_id != self.currency_id: raise ValidationError('Currency must be the same!') - @api.constrains('currency_id', 'so_details') + @api.onchange('so_details') def total_value_constrains(self): total = 0 for sale_oder in self.so_details: total = total + sale_oder.value if total > self.project_value: - raise ValidationError('Total Sale Orer Value must be smaller or equal to Project Value!') + raise ValidationError('Total Sale Order Value must be smaller or equal to Project Value!') @api.depends('so_details') + @api.onchange('so_details') def _compute_paid(self): for project in self: project.project_paid = 0 @@ -283,15 +284,21 @@ def _compute_paid(self): if sale_order.status == 'paid': project.project_paid += sale_order.value + @api.depends('project_paid', 'project_value') @api.onchange('project_paid', 'project_value') def change_status(self): for project in self: - if project.project_paid == 0 and project.project_value == 0: + if project.project_paid == 0 and project.project_value: + project.write({'payment_status': 'unpaid'}) + elif project.project_paid == 0 and project.project_value != 0: project.write({'payment_status': 'unpaid'}) - if 0 < project.project_paid < project.project_value: + elif 0 < project.project_paid < project.project_value: project.write({'payment_status': 'partly paid'}) - if project.project_paid == project.project_value and project.project_value != 0: + elif project.project_paid == project.project_value and project.project_value != 0: project.write({'payment_status': 'paid'}) + else: + project.write({'payment_status': 'unpaid'}) + # @api.onchange('client') diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index affa605..7f11236 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -28,12 +28,14 @@ class MercTransInvoices(models.Model): sale_order_name = fields.Char(string="Sale Order Name") status = fields.Selection(string="Sale Order Status", - selection=status_list, - default='unpaid') + selection=status_list, + default='unpaid', + readonly=True, + store=True) client = fields.Char(string='Client', readonly=True, - compute = "_get_client_name") + compute="_get_client_name") client_po_number = fields.Char(string='Client PO number', readonly=True, @@ -116,3 +118,9 @@ def _inverse_get_discount(self): def _compute_sale_order_value(self): for sale_order in self: sale_order.value = (100 - sale_order.discount) / 100 * sale_order.volume * sale_order.sale_rate + + @api.ondelete(at_uninstall=False) + def _check_status(self): + for sale_order in self: + if sale_order.status == "paid": + raise ValidationError("You cannot delete a sale order with invoice status set to Paid!") diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index e66b076..9a4b140 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -24,7 +24,8 @@ - + + @@ -91,7 +92,7 @@ - +
@@ -156,12 +157,12 @@ - - + + - + From af0fa275a29bb1603ca7f1711f5853a250ba4580 Mon Sep 17 00:00:00 2001 From: svseas Date: Sun, 9 Oct 2022 19:43:04 +0700 Subject: [PATCH 101/112] fix sale order status sync --- .../models/merctrans_invoices.py | 5 +++ .../models/merctrans_projects.py | 32 +++++++++++++++---- .../models/merctrans_sale.py | 2 +- .../views/projects_menus.xml | 9 ++++++ 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index bbadd52..f81a629 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -152,3 +152,8 @@ def sync_status(self): if not self.invoice_status: sale_order.write({'status': 'unpaid'}) + @api.ondelete(at_uninstall=False) + def _check_status(self): + for invoice in self: + if invoice.invoice_status == "paid": + raise ValidationError("You cannot delete an invoice with status set to Paid!") \ 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 b170243..4f34da3 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -185,9 +185,10 @@ class MercTransProjects(models.Model): payment_status = fields.Selection(string='Payment Status*', selection=payment_status_list, default='unpaid', - # required=True, - readonly=True, - store=True) + required=True, + # readonly=True, + store=True, + compute="_change_status") po_details = fields.One2many("merctrans.pos", "project_id", @@ -195,6 +196,28 @@ class MercTransProjects(models.Model): so_details = fields.One2many("merctrans.sale","project_id", string="Sale Orders in this Project") # NOTE: FUNCTION AND API DECORATE + def sync_status(self): + for project in self: + project.project_paid = 0 + for sale_order in self.so_details: + if sale_order.status == 'paid': + project.project_paid += sale_order.value + if project.project_paid == 0 and project.project_value: + project.payment_status = 'unpaid' + elif project.project_paid == 0 and project.project_value != 0: + project.payment_status = 'unpaid' + elif 0 < project.project_paid < project.project_value: + project.payment_status = 'partly paid' + elif project.project_paid == project.project_value and project.project_value != 0: + project.payment_status = 'paid' + + # def compute_sale(self): + # for project in self: + # project.project_paid = 0 + # for sale_order in self.so_details: + # if sale_order.status == 'paid': + # project.project_paid += sale_order.value + def _get_client_name(self): self.client_name = '' for record in self: @@ -253,7 +276,6 @@ def _compute_po_value(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: @@ -276,7 +298,6 @@ def total_value_constrains(self): raise ValidationError('Total Sale Order Value must be smaller or equal to Project Value!') @api.depends('so_details') - @api.onchange('so_details') def _compute_paid(self): for project in self: project.project_paid = 0 @@ -284,7 +305,6 @@ def _compute_paid(self): if sale_order.status == 'paid': project.project_paid += sale_order.value - @api.depends('project_paid', 'project_value') @api.onchange('project_paid', 'project_value') def change_status(self): for project in self: diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index 7f11236..f63edc5 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -30,7 +30,7 @@ class MercTransInvoices(models.Model): status = fields.Selection(string="Sale Order Status", selection=status_list, default='unpaid', - readonly=True, + # readonly=True, store=True) client = fields.Char(string='Client', diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 9a4b140..1194fe3 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -1,5 +1,13 @@ + + Sync Payment Status + ir.actions.server + + + code + records.sync_status() + Merctrans Project lists @@ -269,6 +277,7 @@ + From 0c54ba9de0c70d7054ca9f8a6f90c2a488852247 Mon Sep 17 00:00:00 2001 From: svseas Date: Mon, 10 Oct 2022 10:53:15 +0700 Subject: [PATCH 102/112] fix menu display --- .../merctrans_projects/models/merctrans_invoices.py | 6 +++++- local-addons/merctrans_projects/views/projects_menus.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index f81a629..4b3f879 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -140,18 +140,22 @@ def invoice_status_constrains(self): # return super(MercTransInvoices, self).write(vals) @api.onchange('invoice_status') - def sync_status(self): + def sync_payment_status(self): for sale_order in self.invoice_details_ids: if self.invoice_status == 'paid': sale_order.write({'status': 'paid'}) + if self.invoice_status == 'invoiced': sale_order.write({'status': 'invoiced'}) + if self.invoice_status == 'unpaid': sale_order.write({'status': 'unpaid'}) + if not self.invoice_status: sale_order.write({'status': 'unpaid'}) + @api.ondelete(at_uninstall=False) def _check_status(self): for invoice in self: diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 1194fe3..80dcf8a 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -92,8 +92,8 @@ - + From fcfedfa30bf7ec941c32ebaf5ea84cfad44e9815 Mon Sep 17 00:00:00 2001 From: svseas Date: Mon, 10 Oct 2022 18:30:57 +0700 Subject: [PATCH 103/112] fix sale and invoices --- .../models/merctrans_invoices.py | 17 +++++-- .../models/merctrans_projects.py | 28 +++++++++--- .../models/merctrans_sale.py | 44 ++++++++++++++++--- .../views/projects_menus.xml | 2 +- .../merctrans_projects/views/sale.xml | 8 ++++ 5 files changed, 84 insertions(+), 15 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 4b3f879..a9761a1 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -21,7 +21,8 @@ class MercTransInvoices(models.Model): default=lambda self: self.env['ir.sequence']. next_by_code('increment_invoice_id')) - sender_info = fields.Text(string='Sender Info*') + sender_info = fields.Text(string='Sender Info*', + required=True) invoice_name = fields.Char(string='Invoice #', compute="_get_invoice_name") @@ -37,10 +38,14 @@ class MercTransInvoices(models.Model): invoice_details_ids = fields.Many2many('merctrans.sale', - string='Invoice Lines') + string='Invoice Lines', + domain=[('client', '=', client_name)]) currency_id = fields.Many2one('res.currency', string='Currency') + currency_string = fields.Char(string='Currency String', + compute="_get_currency_string") + invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") @@ -61,6 +66,12 @@ def _compute_invoice_total(self): for invoice in self: invoice.invoice_total = (100 - invoice.discount) / 100 * invoice.invoice_value + @api.onchange('currency_id') + def _get_currency_string(self): + self.currency_string = '' + for project in self: + if project.currency_id: + project.currency_string += project.currency_id.name @api.depends('invoice_client') @api.onchange('invoice_client') @@ -98,7 +109,7 @@ def _compute_invoice_value(self): def currency_constrains(self): for job in self: for x in job.invoice_details_ids: - if job.currency_id != x.currency_id: + if job.currency_string != x.currency_id: raise ValidationError( 'Job currency must be the same as invoice currency!') diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index 4f34da3..29e08b2 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -145,6 +145,8 @@ class MercTransProjects(models.Model): currency_id = fields.Many2one('res.currency', string='Currency*', required=True) + currency_string = fields.Char(string='Currency String', + comput='_get_currency_string') sale_rate = fields.Float(string='Rate*', required=True, default=0) @@ -196,12 +198,15 @@ class MercTransProjects(models.Model): so_details = fields.One2many("merctrans.sale","project_id", string="Sale Orders in this Project") # NOTE: FUNCTION AND API DECORATE - def sync_status(self): + def get_amount_paid(self): for project in self: project.project_paid = 0 for sale_order in self.so_details: if sale_order.status == 'paid': project.project_paid += sale_order.value + + def change_status(self): + for project in self: if project.project_paid == 0 and project.project_value: project.payment_status = 'unpaid' elif project.project_paid == 0 and project.project_value != 0: @@ -211,6 +216,10 @@ def sync_status(self): elif project.project_paid == project.project_value and project.project_value != 0: project.payment_status = 'paid' + def sync_status(self): + self.get_amount_paid() + self.change_status() + # def compute_sale(self): # for project in self: # project.project_paid = 0 @@ -226,6 +235,13 @@ def _get_client_name(self): else: record.client_name = 'default bug' + @api.onchange('currency_id') + def _get_currency_string(self): + self.currency_string = '' + for project in self: + if project.currency_id: + project.currency_string += project.currency_id.name + @api.model def create(self, vals): print("Project Create Vals ", vals) @@ -283,11 +299,11 @@ def _compute_margin(self): project.project_value - project.total_po_value) / project.project_value - @api.constrains('currency_id', 'so_details') - def currency_constrains(self): - for sale_order in self.so_details: - if sale_order.currency_id != self.currency_id: - raise ValidationError('Currency must be the same!') + # @api.constrains('currency_id', 'so_details') + # def currency_constrains(self): + # for sale_order in self.so_details: + # if sale_order.currency_id != self.currency_id: + # raise ValidationError('Currency must be the same!') @api.onchange('so_details') def total_value_constrains(self): diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index f63edc5..9992ae4 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -14,7 +14,8 @@ # # -class MercTransInvoices(models.Model): + +class MercTransSale(models.Model): _name = 'merctrans.sale' _rec_name = 'sale_order_name' _description = 'MercTrans Sale Orders for Project Managers' @@ -22,10 +23,19 @@ class MercTransInvoices(models.Model): status_list = [('invoiced', 'Invoiced'), ('paid', 'Paid'), ('unpaid', 'Unpaid')] + sale_id = fields.Integer('No number', + index=True, + store=True, + readonly=True, + default=lambda self: self.env['ir.sequence']. + next_by_code('increment_invoice_id') + ) + project_id = fields.Many2one('merctrans.projects', string="Project", store=True) - sale_order_name = fields.Char(string="Sale Order Name") + sale_order_name = fields.Char(string="Sale Order Name", + compute="_get_project_name") status = fields.Selection(string="Sale Order Status", selection=status_list, @@ -51,9 +61,9 @@ class MercTransInvoices(models.Model): readonly=True, compute="_get_sale_rate") - currency_id = fields.Many2one('res.currency', - string='Currency*', - required=True) + currency_id = fields.Char(string='Currency*', + required=True, + compute="_get_currency") discount = fields.Integer(string='Discount (%)', compute="_get_discount", @@ -64,6 +74,21 @@ class MercTransInvoices(models.Model): compute="_compute_sale_order_value") # The next section is to automatically populate field when a project is selected. + # @api.model + # def create(self, vals): + # print("Sale Create Vals ", vals) + # vals['number_id'] = self.env['ir.sequence'].next_by_code( + # 'merctrans.sale') or _('New') + # return super(MercTransSale, self).create(vals) + + @api.depends('project_id') + @api.onchange('project_id') + def _get_project_name(self): + for sale_order in self: + if sale_order.project_id.project_id: + sale_order.sale_order_name = f"SO{sale_order.sale_id:05d}-{sale_order.project_id.project_id}" + + @api.onchange('project_id') @api.depends('project_id') def _get_client_name(self): @@ -84,6 +109,14 @@ def _get_client_po_number(self): @api.onchange('project_id') @api.depends('project_id') + def _get_currency(self): + for sale_order in self: + if sale_order.project_id.currency_string: + sale_order.currency_id = sale_order.project_id.currency_string + else: + sale_order.currency_id = " " + @api.onchange('project_id') + @api.depends('project_id') def _get_sale_rate(self): for sale_order in self: if sale_order.project_id.sale_rate: @@ -124,3 +157,4 @@ def _check_status(self): for sale_order in self: if sale_order.status == "paid": raise ValidationError("You cannot delete a sale order with invoice status set to Paid!") + diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 80dcf8a..3dbbe04 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -151,7 +151,7 @@ - + diff --git a/local-addons/merctrans_projects/views/sale.xml b/local-addons/merctrans_projects/views/sale.xml index b033132..5bb6e41 100644 --- a/local-addons/merctrans_projects/views/sale.xml +++ b/local-addons/merctrans_projects/views/sale.xml @@ -8,6 +8,14 @@ + + ID Incrementation + increment_sale_id + + 3 + + + Sale Order Form From 9b9360e70b0f534c7f946583a69f3b05db5e2b2d Mon Sep 17 00:00:00 2001 From: "yoose-joe.tang" Date: Wed, 12 Oct 2022 13:49:04 +0700 Subject: [PATCH 104/112] add ir.model and fix 'comput'->'compute' --- 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 29e08b2..8897702 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -146,7 +146,7 @@ class MercTransProjects(models.Model): string='Currency*', required=True) currency_string = fields.Char(string='Currency String', - comput='_get_currency_string') + compute='_get_currency_string') sale_rate = fields.Float(string='Rate*', required=True, default=0) From ff640efd5fab90a1261a77682d27fdf7ded35874 Mon Sep 17 00:00:00 2001 From: "yoose-joe.tang" Date: Wed, 12 Oct 2022 14:06:30 +0700 Subject: [PATCH 105/112] add tags ir.models.access --- local-addons/merctrans_projects/security/ir.model.access.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/local-addons/merctrans_projects/security/ir.model.access.csv b/local-addons/merctrans_projects/security/ir.model.access.csv index 4f29c79..472db26 100755 --- a/local-addons/merctrans_projects/security/ir.model.access.csv +++ b/local-addons/merctrans_projects/security/ir.model.access.csv @@ -3,7 +3,9 @@ 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_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_pm,1,1,1,1 +acl_pm_tags,merctransproject.tags_default,model_merctrans_tags,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_accounts,merctransproject.accounts_default,model_account_contacts,group_merctrans_pm,1,1,1,1 acl_pm_contributors,merctransproject.contributors_default,model_merctrans_contributors,group_merctrans_pm,1,1,1,1 +acl_pm_sale,merctransproject.sale_default,model_merctrans_sale,group_merctrans_pm,1,1,1,1 acl_contributor_pos,merctransproject.pos_default,model_merctrans_pos,group_merctrans_contributor,1,0,0,0 From 6a8a45553aa298b327b45b79ea155f0894f69f9d Mon Sep 17 00:00:00 2001 From: svseas Date: Sat, 22 Oct 2022 10:47:37 +0700 Subject: [PATCH 106/112] fix sync status bug --- local-addons/merctrans_projects/__manifest__.py | 1 + .../merctrans_projects/data/automation.xml | 15 +++++++++++++++ .../models/merctrans_projects.py | 16 +++++++++++----- .../merctrans_projects/models/merctrans_sale.py | 3 ++- 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 local-addons/merctrans_projects/data/automation.xml diff --git a/local-addons/merctrans_projects/__manifest__.py b/local-addons/merctrans_projects/__manifest__.py index 5faa2b1..fbcaa33 100755 --- a/local-addons/merctrans_projects/__manifest__.py +++ b/local-addons/merctrans_projects/__manifest__.py @@ -40,6 +40,7 @@ 'views/clients.xml', 'views/templates.xml', 'views/sale.xml', + 'data/automation.xml', #data 'data/currencies.xml' ], diff --git a/local-addons/merctrans_projects/data/automation.xml b/local-addons/merctrans_projects/data/automation.xml new file mode 100644 index 0000000..bcdb0f7 --- /dev/null +++ b/local-addons/merctrans_projects/data/automation.xml @@ -0,0 +1,15 @@ + + + + + Auto Sync Payment Status + + code + model.sync_status() + + 1 + minutes + -1 + + + \ 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 8897702..e7c30cb 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -200,10 +200,8 @@ class MercTransProjects(models.Model): def get_amount_paid(self): for project in self: - project.project_paid = 0 - for sale_order in self.so_details: - if sale_order.status == 'paid': - project.project_paid += sale_order.value + project.project_paid = sum(sale.value for sale in project.so_details) + def change_status(self): for project in self: @@ -219,6 +217,9 @@ def change_status(self): def sync_status(self): self.get_amount_paid() self.change_status() + print("Check Status") + + # def compute_sale(self): # for project in self: @@ -248,7 +249,12 @@ def create(self, vals): vals['number_id'] = self.env['ir.sequence'].next_by_code( 'merctrans.project') or _('New') return super(MercTransProjects, self).create(vals) - + @api.model + def auto_crete_sale(self, vals): + for project in self: + if not project.so_details: + res = self.env['merctrans.sale'].create(vals) + return res # @api.model # @api.model # đoạn code bên dưới gây bug khi chỉnh sửa project # def write(self, vals): diff --git a/local-addons/merctrans_projects/models/merctrans_sale.py b/local-addons/merctrans_projects/models/merctrans_sale.py index 9992ae4..63df534 100644 --- a/local-addons/merctrans_projects/models/merctrans_sale.py +++ b/local-addons/merctrans_projects/models/merctrans_sale.py @@ -45,7 +45,8 @@ class MercTransSale(models.Model): client = fields.Char(string='Client', readonly=True, - compute="_get_client_name") + compute="_get_client_name", + store=True) client_po_number = fields.Char(string='Client PO number', readonly=True, From 190526174b48121a85c1789a789bd67a9504654b Mon Sep 17 00:00:00 2001 From: svseas Date: Sun, 23 Oct 2022 14:22:19 +0700 Subject: [PATCH 107/112] fix bugs in projects, invoices, sale --- .../merctrans_projects/data/automation.xml | 5 +- .../models/merctrans_clients.py | 11 ++- .../models/merctrans_invoices.py | 24 +++--- .../models/merctrans_projects.py | 77 ++++++++++--------- .../merctrans_projects/views/__manifest__.py | 3 +- .../merctrans_projects/views/clients.xml | 4 +- .../views/projects_menus.xml | 35 +++++---- .../merctrans_projects/views/sale.xml | 7 +- 8 files changed, 97 insertions(+), 69 deletions(-) diff --git a/local-addons/merctrans_projects/data/automation.xml b/local-addons/merctrans_projects/data/automation.xml index bcdb0f7..793ccf0 100644 --- a/local-addons/merctrans_projects/data/automation.xml +++ b/local-addons/merctrans_projects/data/automation.xml @@ -1,11 +1,12 @@ - + Auto Sync Payment Status + code - model.sync_status() + model.auto_sync_status() 1 minutes diff --git a/local-addons/merctrans_projects/models/merctrans_clients.py b/local-addons/merctrans_projects/models/merctrans_clients.py index 156f04f..00e66cd 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -30,11 +30,11 @@ class MerctransClient(models.Model): ('wire transfer', 'Wire Transfer'), ('payoneer', 'Payoneer')] - name = fields.Char(string='Account Name*') + name = fields.Char(string='Account Name*', required=True) client_short_name = fields.Char(string='Account ID*', readonly=True, compute='_get_client_id') - email = fields.Char(string='Email') + email = fields.Char(string='Email', required=True) country = fields.Many2one('res.country', string='Country') @@ -97,9 +97,14 @@ def _get_client_id(self): if client.name: short_name = "".join(client.name.split()).upper() else: - short_name = "DEFA" + short_name = "On Change" client.client_short_name = f"{short_name[:4]}" + @api.constrains('name') + def validate_existing_name_field(self): + for rec in self: + if not rec.name: + raise ValidationError("Name field must not be empty!") diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index a9761a1..8b7c272 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -38,10 +38,9 @@ class MercTransInvoices(models.Model): invoice_details_ids = fields.Many2many('merctrans.sale', - string='Invoice Lines', - domain=[('client', '=', client_name)]) - - currency_id = fields.Many2one('res.currency', string='Currency') + string='Invoice Lines') + # Currency computed from sale orders (sale order restrains same currency) + currency_id = fields.Many2one('res.currency', string='Currency', required=True) currency_string = fields.Char(string='Currency String', compute="_get_currency_string") @@ -51,14 +50,22 @@ class MercTransInvoices(models.Model): invoice_status = fields.Selection(string="Invoice Status", selection=status_list, - default='unpaid') + default='invoiced') discount = fields.Integer(string='Discount (%)', default=0) invoice_total = fields.Float('Total', compute="_compute_invoice_total", store=True, readonly=True, default=0) - invoice_paid_date = fields.Date(string='Paid Date', default=datetime.today()) + invoice_paid_date = fields.Date(string='Paid Date') + + # Functions and Decorators below + @api.onchange(client_name) + def _onchange_client_name(self): + for rec in self: + search = {'domain': {'invoice_details_ids': [('client', '=', rec.client_name)]}} + print(search) + return search @api.onchange('invoice_total') @api.depends('invoice_value', 'invoice_total', 'discount') @@ -83,7 +90,6 @@ def _get_invoice_client(self): else: inv.client_name = 'default' - @api.depends('invoice_client', 'invoice_id') @api.onchange('invoice_client', 'invoice_id') def _get_invoice_name(self): @@ -126,8 +132,8 @@ def paid_date_constrains(self): for inv in self: if inv.invoice_paid_date and inv.invoice_paid_date < inv.invoice_date: raise ValidationError('Invoice paid date cannot be before invoice due date') - if inv.invoice_status != 'paid' and inv.invoice_paid_date: - raise ValidationError('Cannot have paid date when status is not Paid') + # if inv.invoice_status != 'paid' and inv.invoice_paid_date: + # raise ValidationError('Cannot have paid date when status is not Paid') @api.constrains('invoice_details_ids') def invoice_detail_constrains(self): diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index e7c30cb..bd132d0 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -11,12 +11,9 @@ 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) + services_names = fields.Char('Services') + description = fields.Text('Description') class MercTransTags(models.Model): @@ -197,12 +194,13 @@ class MercTransProjects(models.Model): string="Purchase Orders in this Project") so_details = fields.One2many("merctrans.sale","project_id", string="Sale Orders in this Project") # NOTE: FUNCTION AND API DECORATE - + @api.model def get_amount_paid(self): for project in self: - project.project_paid = sum(sale.value for sale in project.so_details) + project.project_paid = sum(sale.value for sale in project.so_details if sale.status == "paid") + print("Amount paid function executed!") - + @api.model def change_status(self): for project in self: if project.project_paid == 0 and project.project_value: @@ -213,20 +211,31 @@ def change_status(self): project.payment_status = 'partly paid' elif project.project_paid == project.project_value and project.project_value != 0: project.payment_status = 'paid' + print("Change status executed!") + @api.model def sync_status(self): - self.get_amount_paid() - self.change_status() - print("Check Status") + for project in self: + project.get_amount_paid() + project.change_status() + + # self.get_amount_paid() + # self.change_status() + # print("Sync Status Executed") + + @api.model + def auto_sync_status(self): + records = self.env['merctrans.projects'].search([]) + for record in records: + record.sync_status() + + @api.model + def test_cron(self): + print("test cron") + - # def compute_sale(self): - # for project in self: - # project.project_paid = 0 - # for sale_order in self.so_details: - # if sale_order.status == 'paid': - # project.project_paid += sale_order.value def _get_client_name(self): self.client_name = '' @@ -249,8 +258,9 @@ def create(self, vals): vals['number_id'] = self.env['ir.sequence'].next_by_code( 'merctrans.project') or _('New') return super(MercTransProjects, self).create(vals) + @api.model - def auto_crete_sale(self, vals): + def auto_create_sale(self, vals): for project in self: if not project.so_details: res = self.env['merctrans.sale'].create(vals) @@ -322,24 +332,21 @@ def total_value_constrains(self): @api.depends('so_details') def _compute_paid(self): for project in self: - project.project_paid = 0 - for sale_order in self.so_details: - if sale_order.status == 'paid': - project.project_paid += sale_order.value + project.project_paid = sum(sale.value for sale in project.so_details if sale.status == "paid") - @api.onchange('project_paid', 'project_value') - def change_status(self): - for project in self: - if project.project_paid == 0 and project.project_value: - project.write({'payment_status': 'unpaid'}) - elif project.project_paid == 0 and project.project_value != 0: - project.write({'payment_status': 'unpaid'}) - elif 0 < project.project_paid < project.project_value: - project.write({'payment_status': 'partly paid'}) - elif project.project_paid == project.project_value and project.project_value != 0: - project.write({'payment_status': 'paid'}) - else: - project.write({'payment_status': 'unpaid'}) + # @api.onchange('project_paid', 'project_value') + # def change_status(self): + # for project in self: + # if project.project_paid == 0 and project.project_value: + # project.write({'payment_status': 'unpaid'}) + # elif project.project_paid == 0 and project.project_value != 0: + # project.write({'payment_status': 'unpaid'}) + # elif 0 < project.project_paid < project.project_value: + # project.write({'payment_status': 'partly paid'}) + # elif project.project_paid == project.project_value and project.project_value != 0: + # project.write({'payment_status': 'paid'}) + # else: + # project.write({'payment_status': 'unpaid'}) diff --git a/local-addons/merctrans_projects/views/__manifest__.py b/local-addons/merctrans_projects/views/__manifest__.py index 0c2917f..b6861e9 100755 --- a/local-addons/merctrans_projects/views/__manifest__.py +++ b/local-addons/merctrans_projects/views/__manifest__.py @@ -33,7 +33,8 @@ 'views/projects_menus.xml', 'views/templates.xml', 'views/sale.xml', - 'views/po.xml' + 'views/po.xml', + 'data/automation.xml' ], # only loaded in demonstration mode 'demo': [ diff --git a/local-addons/merctrans_projects/views/clients.xml b/local-addons/merctrans_projects/views/clients.xml index 8028be7..12f9727 100644 --- a/local-addons/merctrans_projects/views/clients.xml +++ b/local-addons/merctrans_projects/views/clients.xml @@ -8,13 +8,13 @@ - Contacts + Clients account.contacts tree,form - + Account Form View diff --git a/local-addons/merctrans_projects/views/projects_menus.xml b/local-addons/merctrans_projects/views/projects_menus.xml index 3dbbe04..b923bdb 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -90,26 +90,33 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -226,7 +233,7 @@ - + diff --git a/local-addons/merctrans_projects/views/sale.xml b/local-addons/merctrans_projects/views/sale.xml index 5bb6e41..d3b1473 100644 --- a/local-addons/merctrans_projects/views/sale.xml +++ b/local-addons/merctrans_projects/views/sale.xml @@ -24,9 +24,9 @@
- - + + @@ -34,6 +34,7 @@ + @@ -47,9 +48,9 @@ merctrans.sale - + From 21e9e34454840350eec6141907e206b0dfec66d6 Mon Sep 17 00:00:00 2001 From: svseas Date: Sun, 23 Oct 2022 20:33:36 +0700 Subject: [PATCH 108/112] cron job for sync status --- .../merctrans_projects/models/merctrans_projects.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_projects.py b/local-addons/merctrans_projects/models/merctrans_projects.py index bd132d0..e35e41b 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -229,14 +229,6 @@ def auto_sync_status(self): for record in records: record.sync_status() - @api.model - def test_cron(self): - print("test cron") - - - - - def _get_client_name(self): self.client_name = '' for record in self: From 0a2ae8f57dcee32f4f605fa555146850eea970c2 Mon Sep 17 00:00:00 2001 From: svseas Date: Mon, 24 Oct 2022 12:29:19 +0700 Subject: [PATCH 109/112] fix invoices --- .../models/merctrans_invoices.py | 60 ++++++++----------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index 8b7c272..bcff92d 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -6,6 +6,8 @@ from odoo import api, fields, models + + class MercTransInvoices(models.Model): _name = 'merctrans.invoices' _rec_name = 'invoice_name' @@ -36,14 +38,12 @@ class MercTransInvoices(models.Model): client_name = fields.Char(compute="_get_invoice_client") - invoice_details_ids = fields.Many2many('merctrans.sale', string='Invoice Lines') # Currency computed from sale orders (sale order restrains same currency) - currency_id = fields.Many2one('res.currency', string='Currency', required=True) - - currency_string = fields.Char(string='Currency String', - compute="_get_currency_string") + currency_id = fields.Char(string='Currency*', + required=True, + compute="_get_currency") invoice_value = fields.Float("Sub Total", compute="_compute_invoice_value") @@ -59,12 +59,19 @@ class MercTransInvoices(models.Model): invoice_paid_date = fields.Date(string='Paid Date') # Functions and Decorators below + @api.constrains('invoice_details_ids') + def _constrains_currency(self): + for rec in self: + for sale in rec.invoice_details_ids: + if sale.currency_id != rec.currency_id: + raise ValidationError("Sale Order Currencies must be the same") - @api.onchange(client_name) + # if check_rep == False: + # raise ValidationError("Sale Orders' Currencies must be the same") + @api.onchange('client_name') def _onchange_client_name(self): for rec in self: search = {'domain': {'invoice_details_ids': [('client', '=', rec.client_name)]}} - print(search) return search @api.onchange('invoice_total') @@ -73,12 +80,7 @@ def _compute_invoice_total(self): for invoice in self: invoice.invoice_total = (100 - invoice.discount) / 100 * invoice.invoice_value - @api.onchange('currency_id') - def _get_currency_string(self): - self.currency_string = '' - for project in self: - if project.currency_id: - project.currency_string += project.currency_id.name + @api.depends('invoice_client') @api.onchange('invoice_client') @@ -105,20 +107,12 @@ def _get_invoice_name(self): def _compute_invoice_value(self): for item in self: item.invoice_value = 0 - for line in item.invoice_details_ids: - if line.value: - item.invoice_value += line.value + for sale in item.invoice_details_ids: + if item.invoice_details_ids: + item.invoice_value += sale.value else: item.invoice_value = 0 - @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_string != x.currency_id: - raise ValidationError( - 'Job currency must be the same as invoice currency!') - @api.constrains('invoice_details_ids', 'invoice_client') def client_constrains(self): for inv in self: @@ -126,6 +120,13 @@ def client_constrains(self): if inv.client_name != sale_order.client: raise ValidationError('You can only include jobs from the same client!') + @api.onchange('invoice_details_ids') + def _get_currency(self): + for rec in self: + if rec.invoice_details_ids: + rec.currency_id = rec.invoice_details_ids[0].currency_id + else: + rec.currency_id = "USD" @api.constrains('invoice_paid_date','invoice_date', 'invoice_status') def paid_date_constrains(self): @@ -145,16 +146,7 @@ def invoice_detail_constrains(self): def invoice_status_constrains(self): for inv in self: if not inv.invoice_details_ids and inv.invoice_status: - raise ValidationError('Cannot set invoice status when there is no job!') - - # @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) + raise ValidationError('Cannot set invoice status when there is no job!')\ @api.onchange('invoice_status') def sync_payment_status(self): From a38cc0bc4d2784c8e0a63a3a2fa194b7f875f186 Mon Sep 17 00:00:00 2001 From: svseas Date: Tue, 25 Oct 2022 16:32:21 +0700 Subject: [PATCH 110/112] fix invoice currency --- .../merctrans_projects/models/merctrans_invoices.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/local-addons/merctrans_projects/models/merctrans_invoices.py b/local-addons/merctrans_projects/models/merctrans_invoices.py index bcff92d..1baa8cb 100644 --- a/local-addons/merctrans_projects/models/merctrans_invoices.py +++ b/local-addons/merctrans_projects/models/merctrans_invoices.py @@ -80,8 +80,6 @@ def _compute_invoice_total(self): for invoice in self: invoice.invoice_total = (100 - invoice.discount) / 100 * invoice.invoice_value - - @api.depends('invoice_client') @api.onchange('invoice_client') def _get_invoice_client(self): @@ -128,13 +126,11 @@ def _get_currency(self): else: rec.currency_id = "USD" - @api.constrains('invoice_paid_date','invoice_date', 'invoice_status') + @api.constrains('invoice_paid_date', 'invoice_date', 'invoice_status') def paid_date_constrains(self): for inv in self: if inv.invoice_paid_date and inv.invoice_paid_date < inv.invoice_date: raise ValidationError('Invoice paid date cannot be before invoice due date') - # if inv.invoice_status != 'paid' and inv.invoice_paid_date: - # raise ValidationError('Cannot have paid date when status is not Paid') @api.constrains('invoice_details_ids') def invoice_detail_constrains(self): @@ -148,6 +144,7 @@ def invoice_status_constrains(self): if not inv.invoice_details_ids and inv.invoice_status: raise ValidationError('Cannot set invoice status when there is no job!')\ + @api.onchange('invoice_status') def sync_payment_status(self): @@ -164,7 +161,6 @@ def sync_payment_status(self): if not self.invoice_status: sale_order.write({'status': 'unpaid'}) - @api.ondelete(at_uninstall=False) def _check_status(self): for invoice in self: From eb19abc296d9886b4142284828ba3795b712dfae Mon Sep 17 00:00:00 2001 From: svseas Date: Thu, 27 Oct 2022 04:20:51 +0700 Subject: [PATCH 111/112] fix PO --- .../merctrans_projects/models/merctrans_clients.py | 7 +++++++ .../merctrans_projects/models/merctrans_projects.py | 4 ++-- 2 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 00e66cd..aa3d767 100644 --- a/local-addons/merctrans_projects/models/merctrans_clients.py +++ b/local-addons/merctrans_projects/models/merctrans_clients.py @@ -106,6 +106,12 @@ def validate_existing_name_field(self): if not rec.name: raise ValidationError("Name field must not be empty!") + @api.constrains(client_contact_list) + def validate_client_name(self): + for client in self: + for contact in self.client_contact_list: + if client.name != contact.contact_id: + raise ValidationError("Can only create contact in the same company!") class AccountContact(models.Model): @@ -133,3 +139,4 @@ def validate_email(self): contact.contact_email = "N/A" if match is None: 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 e35e41b..9ffc28f 100755 --- a/local-addons/merctrans_projects/models/merctrans_projects.py +++ b/local-addons/merctrans_projects/models/merctrans_projects.py @@ -167,7 +167,6 @@ class MercTransProjects(models.Model): project_margin = fields.Float("Project Margin", compute="_compute_margin", store=True, - readonly=True, default=0) # NOTE: PROJECT STATUS @@ -300,6 +299,7 @@ def _compute_po_value(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: @@ -313,7 +313,7 @@ def _compute_margin(self): # if sale_order.currency_id != self.currency_id: # raise ValidationError('Currency must be the same!') - @api.onchange('so_details') + @api.constrains('so_details') def total_value_constrains(self): total = 0 for sale_oder in self.so_details: From 39c3590d65c519660bdbd2de86c84ec50a21930b Mon Sep 17 00:00:00 2001 From: svseas Date: Thu, 27 Oct 2022 11:44:50 +0700 Subject: [PATCH 112/112] fix po readonly --- 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 b923bdb..fb89ce3 100755 --- a/local-addons/merctrans_projects/views/projects_menus.xml +++ b/local-addons/merctrans_projects/views/projects_menus.xml @@ -285,7 +285,7 @@ - +