gea-program 0.44.0__tar.gz → 0.46.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. {gea_program-0.44.0/gea_program.egg-info → gea_program-0.46.0}/PKG-INFO +28 -1
  2. {gea_program-0.44.0 → gea_program-0.46.0}/README.md +27 -0
  3. {gea_program-0.44.0 → gea_program-0.46.0}/gea/__init__.py +1 -1
  4. {gea_program-0.44.0 → gea_program-0.46.0}/gea/__main__.py +117 -0
  5. {gea_program-0.44.0 → gea_program-0.46.0}/gea/acceptance_tests.py +433 -1
  6. {gea_program-0.44.0 → gea_program-0.46.0}/gea/client_reports.py +15 -1
  7. {gea_program-0.44.0 → gea_program-0.46.0}/gea/dossier.py +134 -17
  8. {gea_program-0.44.0 → gea_program-0.46.0}/gea/dossier_verify.py +49 -2
  9. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/dossier.md +3 -1
  10. gea_program-0.46.0/gea/help/invoice-check.md +15 -0
  11. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/opseis.md +2 -2
  12. gea_program-0.46.0/gea/help/pad-summary.md +13 -0
  13. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/report-history.md +2 -0
  14. {gea_program-0.44.0 → gea_program-0.46.0}/gea/helplib.py +3 -1
  15. gea_program-0.46.0/gea/invoice_check.py +786 -0
  16. {gea_program-0.44.0 → gea_program-0.46.0}/gea/notify.py +6 -1
  17. {gea_program-0.44.0 → gea_program-0.46.0}/gea/op_seismicity.py +109 -5
  18. gea_program-0.46.0/gea/pad_summary.py +305 -0
  19. gea_program-0.46.0/gea/pdf_report.py +532 -0
  20. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_watch.py +10 -5
  21. {gea_program-0.44.0 → gea_program-0.46.0}/gea/service.py +51 -0
  22. {gea_program-0.44.0 → gea_program-0.46.0}/gea/web/app.html +47 -5
  23. {gea_program-0.44.0 → gea_program-0.46.0/gea_program.egg-info}/PKG-INFO +28 -1
  24. {gea_program-0.44.0 → gea_program-0.46.0}/gea_program.egg-info/SOURCES.txt +5 -0
  25. {gea_program-0.44.0 → gea_program-0.46.0}/pyproject.toml +1 -1
  26. {gea_program-0.44.0 → gea_program-0.46.0}/LICENSE +0 -0
  27. {gea_program-0.44.0 → gea_program-0.46.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  28. {gea_program-0.44.0 → gea_program-0.46.0}/gea/accuracy_statement.py +0 -0
  29. {gea_program-0.44.0 → gea_program-0.46.0}/gea/alarm_engine.py +0 -0
  30. {gea_program-0.44.0 → gea_program-0.46.0}/gea/alerts.py +0 -0
  31. {gea_program-0.44.0 → gea_program-0.46.0}/gea/backup.py +0 -0
  32. {gea_program-0.44.0 → gea_program-0.46.0}/gea/bench.py +0 -0
  33. {gea_program-0.44.0 → gea_program-0.46.0}/gea/blind_harness.py +0 -0
  34. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  35. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  36. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  37. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  38. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  39. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  40. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  41. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  42. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  43. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  44. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  45. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  46. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  47. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  48. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  49. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  50. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  51. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  52. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  53. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  54. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  55. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  56. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  57. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  58. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  59. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  60. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  61. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  62. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  63. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  64. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  65. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  66. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  67. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  68. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  69. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  70. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  71. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  72. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  73. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  74. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  75. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  76. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  77. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  78. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  79. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  80. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  81. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  82. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  83. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  84. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  85. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  86. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  87. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  88. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  89. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  90. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  91. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  92. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  93. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  94. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  95. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  96. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  97. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  98. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  99. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  100. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  101. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/med_160_sapropels.txt +0 -0
  102. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  103. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  104. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  105. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  106. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  107. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  108. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  109. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  110. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  111. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  112. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  113. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  114. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  115. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  116. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  117. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  118. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  119. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  120. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  121. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  122. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  123. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  124. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  125. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  126. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  127. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  128. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  129. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  130. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  131. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  132. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  133. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  134. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  135. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  136. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  137. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  138. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog_map.py +0 -0
  139. {gea_program-0.44.0 → gea_program-0.46.0}/gea/catalog_register.py +0 -0
  140. {gea_program-0.44.0 → gea_program-0.46.0}/gea/certificates.py +0 -0
  141. {gea_program-0.44.0 → gea_program-0.46.0}/gea/cli.py +0 -0
  142. {gea_program-0.44.0 → gea_program-0.46.0}/gea/config_versioning.py +0 -0
  143. {gea_program-0.44.0 → gea_program-0.46.0}/gea/conformance.py +0 -0
  144. {gea_program-0.44.0 → gea_program-0.46.0}/gea/control_room.py +0 -0
  145. {gea_program-0.44.0 → gea_program-0.46.0}/gea/correlation.py +0 -0
  146. {gea_program-0.44.0 → gea_program-0.46.0}/gea/dashboard.py +0 -0
  147. {gea_program-0.44.0 → gea_program-0.46.0}/gea/declarations.py +0 -0
  148. {gea_program-0.44.0 → gea_program-0.46.0}/gea/deviation.py +0 -0
  149. {gea_program-0.44.0 → gea_program-0.46.0}/gea/dlis.py +0 -0
  150. {gea_program-0.44.0 → gea_program-0.46.0}/gea/dnp3.py +0 -0
  151. {gea_program-0.44.0 → gea_program-0.46.0}/gea/doctor.py +0 -0
  152. {gea_program-0.44.0 → gea_program-0.46.0}/gea/downhole_engine.py +0 -0
  153. {gea_program-0.44.0 → gea_program-0.46.0}/gea/drift_monitor.py +0 -0
  154. {gea_program-0.44.0 → gea_program-0.46.0}/gea/drill_string.py +0 -0
  155. {gea_program-0.44.0 → gea_program-0.46.0}/gea/earth_model.py +0 -0
  156. {gea_program-0.44.0 → gea_program-0.46.0}/gea/economics.py +0 -0
  157. {gea_program-0.44.0 → gea_program-0.46.0}/gea/ed25519.py +0 -0
  158. {gea_program-0.44.0 → gea_program-0.46.0}/gea/edr.py +0 -0
  159. {gea_program-0.44.0 → gea_program-0.46.0}/gea/elevation.py +0 -0
  160. {gea_program-0.44.0 → gea_program-0.46.0}/gea/etp.py +0 -0
  161. {gea_program-0.44.0 → gea_program-0.46.0}/gea/etp12_schemas.json +0 -0
  162. {gea_program-0.44.0 → gea_program-0.46.0}/gea/example_register_map.json +0 -0
  163. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fat_sat.py +0 -0
  164. {gea_program-0.44.0 → gea_program-0.46.0}/gea/files.py +0 -0
  165. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fixtures/README.md +0 -0
  166. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  167. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
  168. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  169. {gea_program-0.44.0 → gea_program-0.46.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  170. {gea_program-0.44.0 → gea_program-0.46.0}/gea/follower.py +0 -0
  171. {gea_program-0.44.0 → gea_program-0.46.0}/gea/forward_model.py +0 -0
  172. {gea_program-0.44.0 → gea_program-0.46.0}/gea/friction_priors.py +0 -0
  173. {gea_program-0.44.0 → gea_program-0.46.0}/gea/gamma.py +0 -0
  174. {gea_program-0.44.0 → gea_program-0.46.0}/gea/gauge_aging.py +0 -0
  175. {gea_program-0.44.0 → gea_program-0.46.0}/gea/gauge_specs.py +0 -0
  176. {gea_program-0.44.0 → gea_program-0.46.0}/gea/geodesy.py +0 -0
  177. {gea_program-0.44.0 → gea_program-0.46.0}/gea/gravity_reference.py +0 -0
  178. {gea_program-0.44.0 → gea_program-0.46.0}/gea/hartip.py +0 -0
  179. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/TESTER_GUIDE.md +0 -0
  180. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/alarms.md +0 -0
  181. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/alerts.md +0 -0
  182. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/audit-update.md +0 -0
  183. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/backup.md +0 -0
  184. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/catalog.md +0 -0
  185. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/charts.md +0 -0
  186. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/conformance.md +0 -0
  187. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/control-room.md +0 -0
  188. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/data-in.md +0 -0
  189. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/declare.md +0 -0
  190. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/dlis.md +0 -0
  191. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/doctor.md +0 -0
  192. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/drift.md +0 -0
  193. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/drillstring.md +0 -0
  194. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/economics.md +0 -0
  195. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/edr.md +0 -0
  196. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/etp.md +0 -0
  197. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/field-ports.md +0 -0
  198. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/files.md +0 -0
  199. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/historian.md +0 -0
  200. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/instruments.md +0 -0
  201. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/interval.md +0 -0
  202. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/map.md +0 -0
  203. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/month-end.md +0 -0
  204. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/notifications.md +0 -0
  205. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/osdu.md +0 -0
  206. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/patches.md +0 -0
  207. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/penetrator.md +0 -0
  208. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/ppdm.md +0 -0
  209. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/quakeml.md +0 -0
  210. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/quality.md +0 -0
  211. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/seedlink.md +0 -0
  212. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/seismic.md +0 -0
  213. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/setup.md +0 -0
  214. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/simulation.md +0 -0
  215. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/site.md +0 -0
  216. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/sites.md +0 -0
  217. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/slip.md +0 -0
  218. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/soak.md +0 -0
  219. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/sra.md +0 -0
  220. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/start.md +0 -0
  221. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/structure.md +0 -0
  222. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/tools.md +0 -0
  223. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/transients.md +0 -0
  224. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/upkeep.md +0 -0
  225. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/vibration.md +0 -0
  226. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/well-report.md +0 -0
  227. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/well-tests.md +0 -0
  228. {gea_program-0.44.0 → gea_program-0.46.0}/gea/help/well3d.md +0 -0
  229. {gea_program-0.44.0 → gea_program-0.46.0}/gea/housekeeping.py +0 -0
  230. {gea_program-0.44.0 → gea_program-0.46.0}/gea/interval.py +0 -0
  231. {gea_program-0.44.0 → gea_program-0.46.0}/gea/inverse_engine.py +0 -0
  232. {gea_program-0.44.0 → gea_program-0.46.0}/gea/jobs.py +0 -0
  233. {gea_program-0.44.0 → gea_program-0.46.0}/gea/live_ports.py +0 -0
  234. {gea_program-0.44.0 → gea_program-0.46.0}/gea/loadtest.py +0 -0
  235. {gea_program-0.44.0 → gea_program-0.46.0}/gea/matplotlib_demo.py +0 -0
  236. {gea_program-0.44.0 → gea_program-0.46.0}/gea/modbus.py +0 -0
  237. {gea_program-0.44.0 → gea_program-0.46.0}/gea/modbus_rtu.py +0 -0
  238. {gea_program-0.44.0 → gea_program-0.46.0}/gea/model_card.py +0 -0
  239. {gea_program-0.44.0 → gea_program-0.46.0}/gea/month_end.py +0 -0
  240. {gea_program-0.44.0 → gea_program-0.46.0}/gea/mqtt_port.py +0 -0
  241. {gea_program-0.44.0 → gea_program-0.46.0}/gea/opcua_port.py +0 -0
  242. {gea_program-0.44.0 → gea_program-0.46.0}/gea/operator_app.py +0 -0
  243. {gea_program-0.44.0 → gea_program-0.46.0}/gea/osdu.py +0 -0
  244. {gea_program-0.44.0 → gea_program-0.46.0}/gea/patches.py +0 -0
  245. {gea_program-0.44.0 → gea_program-0.46.0}/gea/penetrator.py +0 -0
  246. {gea_program-0.44.0 → gea_program-0.46.0}/gea/permits.py +0 -0
  247. {gea_program-0.44.0 → gea_program-0.46.0}/gea/piwebapi.py +0 -0
  248. {gea_program-0.44.0 → gea_program-0.46.0}/gea/ports.py +0 -0
  249. {gea_program-0.44.0 → gea_program-0.46.0}/gea/ppdm.py +0 -0
  250. {gea_program-0.44.0 → gea_program-0.46.0}/gea/profile_catalog.py +0 -0
  251. {gea_program-0.44.0 → gea_program-0.46.0}/gea/project.py +0 -0
  252. {gea_program-0.44.0 → gea_program-0.46.0}/gea/qt6_downhole_app.py +0 -0
  253. {gea_program-0.44.0 → gea_program-0.46.0}/gea/quakeml.py +0 -0
  254. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reconciler.py +0 -0
  255. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  256. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  257. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
  258. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/eia_prices.provenance.json +0 -0
  259. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
  260. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  261. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  262. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  263. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  264. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/mahoning_example.json +0 -0
  265. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/mud_motor_specs.json +0 -0
  266. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/penetrator_ratings.json +0 -0
  267. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/seismicity_protocols.json +0 -0
  268. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/tool_sources.json +0 -0
  269. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/us_outline.json +0 -0
  270. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/us_outline.provenance.json +0 -0
  271. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_3d.provenance.json +0 -0
  272. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
  273. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
  274. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
  275. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_surfaces.json.gz +0 -0
  276. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
  277. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
  278. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
  279. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
  280. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
  281. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
  282. {gea_program-0.44.0 → gea_program-0.46.0}/gea/reference/volve_well_picks.csv.gz +0 -0
  283. {gea_program-0.44.0 → gea_program-0.46.0}/gea/report_history.py +0 -0
  284. {gea_program-0.44.0 → gea_program-0.46.0}/gea/rock_inventory.py +0 -0
  285. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sample_record.py +0 -0
  286. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sample_well_profile.csv +0 -0
  287. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sbom.py +0 -0
  288. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seedlink.py +0 -0
  289. {gea_program-0.44.0 → gea_program-0.46.0}/gea/segy.py +0 -0
  290. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic.py +0 -0
  291. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_array.py +0 -0
  292. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_assoc.py +0 -0
  293. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_detect.py +0 -0
  294. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_film.py +0 -0
  295. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_harmonic.py +0 -0
  296. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_qc.py +0 -0
  297. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_response.py +0 -0
  298. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_signature.py +0 -0
  299. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_track.py +0 -0
  300. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_uncertainty.py +0 -0
  301. {gea_program-0.44.0 → gea_program-0.46.0}/gea/seismic_unlisted.py +0 -0
  302. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sensor_swap.py +0 -0
  303. {gea_program-0.44.0 → gea_program-0.46.0}/gea/series_cache.py +0 -0
  304. {gea_program-0.44.0 → gea_program-0.46.0}/gea/service_life.py +0 -0
  305. {gea_program-0.44.0 → gea_program-0.46.0}/gea/setup_checklist.py +0 -0
  306. {gea_program-0.44.0 → gea_program-0.46.0}/gea/shapefile.py +0 -0
  307. {gea_program-0.44.0 → gea_program-0.46.0}/gea/shell.py +0 -0
  308. {gea_program-0.44.0 → gea_program-0.46.0}/gea/shut_in.py +0 -0
  309. {gea_program-0.44.0 → gea_program-0.46.0}/gea/simulation.py +0 -0
  310. {gea_program-0.44.0 → gea_program-0.46.0}/gea/site_map.py +0 -0
  311. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sla_report.py +0 -0
  312. {gea_program-0.44.0 → gea_program-0.46.0}/gea/slip.py +0 -0
  313. {gea_program-0.44.0 → gea_program-0.46.0}/gea/soak.py +0 -0
  314. {gea_program-0.44.0 → gea_program-0.46.0}/gea/sra.py +0 -0
  315. {gea_program-0.44.0 → gea_program-0.46.0}/gea/store_forward.py +0 -0
  316. {gea_program-0.44.0 → gea_program-0.46.0}/gea/strata_join.py +0 -0
  317. {gea_program-0.44.0 → gea_program-0.46.0}/gea/structure.py +0 -0
  318. {gea_program-0.44.0 → gea_program-0.46.0}/gea/supervisor.py +0 -0
  319. {gea_program-0.44.0 → gea_program-0.46.0}/gea/survey_cmd.py +0 -0
  320. {gea_program-0.44.0 → gea_program-0.46.0}/gea/survey_view.py +0 -0
  321. {gea_program-0.44.0 → gea_program-0.46.0}/gea/telemetry.py +0 -0
  322. {gea_program-0.44.0 → gea_program-0.46.0}/gea/tool_catalog.py +0 -0
  323. {gea_program-0.44.0 → gea_program-0.46.0}/gea/tool_library.py +0 -0
  324. {gea_program-0.44.0 → gea_program-0.46.0}/gea/tool_taxonomy.py +0 -0
  325. {gea_program-0.44.0 → gea_program-0.46.0}/gea/transient.py +0 -0
  326. {gea_program-0.44.0 → gea_program-0.46.0}/gea/vibration.py +0 -0
  327. {gea_program-0.44.0 → gea_program-0.46.0}/gea/well3d.py +0 -0
  328. {gea_program-0.44.0 → gea_program-0.46.0}/gea/well_assembler.py +0 -0
  329. {gea_program-0.44.0 → gea_program-0.46.0}/gea/well_report.py +0 -0
  330. {gea_program-0.44.0 → gea_program-0.46.0}/gea/well_test_validation.py +0 -0
  331. {gea_program-0.44.0 → gea_program-0.46.0}/gea/wits0.py +0 -0
  332. {gea_program-0.44.0 → gea_program-0.46.0}/gea/witsml.py +0 -0
  333. {gea_program-0.44.0 → gea_program-0.46.0}/gea/workspace.py +0 -0
  334. {gea_program-0.44.0 → gea_program-0.46.0}/gea_program.egg-info/dependency_links.txt +0 -0
  335. {gea_program-0.44.0 → gea_program-0.46.0}/gea_program.egg-info/entry_points.txt +0 -0
  336. {gea_program-0.44.0 → gea_program-0.46.0}/gea_program.egg-info/requires.txt +0 -0
  337. {gea_program-0.44.0 → gea_program-0.46.0}/gea_program.egg-info/top_level.txt +0 -0
  338. {gea_program-0.44.0 → gea_program-0.46.0}/setup.cfg +0 -0
  339. {gea_program-0.44.0 → gea_program-0.46.0}/tests/test_acceptance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gea-program
3
- Version: 0.44.0
3
+ Version: 0.46.0
4
4
  Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
5
5
  Author: Daniel T. Murphy
6
6
  License: MPL-2.0
@@ -648,6 +648,33 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
648
648
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
649
649
  `rtserve.iris.washington.edu:18000`, network `TX`.
650
650
 
651
+ ### The invoice cross-check
652
+
653
+ The drilling contractor's daywork invoice, day by day, against the daily
654
+ drilling reports and the drilling record, at the contract's terms as the
655
+ operator declares them: hours billed against hours reported, standby billed
656
+ at the operating rate, rig repair past the allowance, a trip or a circulation
657
+ the recorder never saw, a depth or footage overstated, an amount that is not
658
+ quantity times price, a day billed with no report. Each day AGREES, is in
659
+ QUESTION or DIFFERS, with the dollars in question and the line each comes
660
+ from; a client report with its PDF. The **Invoice check** tab, `gea
661
+ invoice-check`, `gea help invoice-check`.
662
+
663
+ ### The lateral, the printable reports, the daily summary and the key
664
+
665
+ An earthquake near a well with a directional survey is measured from the
666
+ nearest point of its lateral, not from the pad - with the measured depth
667
+ there and the distance to the hypocentre - so a protocol radius is read
668
+ against the well bore a regulator means. Every client report is also
669
+ written as a PDF beside its HTML (the drawings redrawn, long tables
670
+ continued across pages) and kept in report history. Each morning the
671
+ program writes a one-page pad summary - what changed, what is due, what is
672
+ still missing - and sends it through the notification rules (`gea
673
+ pad-summary`). The dossier signing key can be retired and replaced: the old
674
+ key signs the hand-over, earlier dossiers still check out, and later ones
675
+ carry the rotation so a client can follow it (`gea dossier --rotate-key`).
676
+ `gea help pad-summary`.
677
+
651
678
  ### The earthquake watch and the alerts
652
679
 
653
680
  While a well operates, the program reads the USGS earthquake catalogue
@@ -609,6 +609,33 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
609
609
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
610
610
  `rtserve.iris.washington.edu:18000`, network `TX`.
611
611
 
612
+ ### The invoice cross-check
613
+
614
+ The drilling contractor's daywork invoice, day by day, against the daily
615
+ drilling reports and the drilling record, at the contract's terms as the
616
+ operator declares them: hours billed against hours reported, standby billed
617
+ at the operating rate, rig repair past the allowance, a trip or a circulation
618
+ the recorder never saw, a depth or footage overstated, an amount that is not
619
+ quantity times price, a day billed with no report. Each day AGREES, is in
620
+ QUESTION or DIFFERS, with the dollars in question and the line each comes
621
+ from; a client report with its PDF. The **Invoice check** tab, `gea
622
+ invoice-check`, `gea help invoice-check`.
623
+
624
+ ### The lateral, the printable reports, the daily summary and the key
625
+
626
+ An earthquake near a well with a directional survey is measured from the
627
+ nearest point of its lateral, not from the pad - with the measured depth
628
+ there and the distance to the hypocentre - so a protocol radius is read
629
+ against the well bore a regulator means. Every client report is also
630
+ written as a PDF beside its HTML (the drawings redrawn, long tables
631
+ continued across pages) and kept in report history. Each morning the
632
+ program writes a one-page pad summary - what changed, what is due, what is
633
+ still missing - and sends it through the notification rules (`gea
634
+ pad-summary`). The dossier signing key can be retired and replaced: the old
635
+ key signs the hand-over, earlier dossiers still check out, and later ones
636
+ carry the rotation so a client can follow it (`gea dossier --rotate-key`).
637
+ `gea help pad-summary`.
638
+
612
639
  ### The earthquake watch and the alerts
613
640
 
614
641
  While a well operates, the program reads the USGS earthquake catalogue
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.44.0"
126
+ __version__ = "0.46.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -584,9 +584,39 @@ def main(argv=None) -> int:
584
584
  p_dz.add_argument("--sources", type=str, default="", help="with --verify: a folder holding the source records to check against their hashes")
585
585
  p_dz.add_argument("--key", action="store_true", help="print this site's signing key fingerprint")
586
586
  p_dz.add_argument("--list", action="store_true", help="list the dossiers this site has signed")
587
+ p_dz.add_argument("--rotate-key", action="store_true", help="retire this site's signing key and start a new one, signed over by the old (give --reason)")
588
+ p_dz.add_argument("--reason", type=str, default="", help="with --rotate-key: why the key is retired")
589
+ p_dz.add_argument("--key-history", action="store_true", help="the site's keys, current and retired, and the rotations between them")
587
590
  p_dz.add_argument("--actor", type=str, default="cli")
588
591
  p_dz.add_argument("--json", action="store_true")
589
592
 
593
+ p_iv = sub.add_parser("invoice-check", help="the drilling contractor's daywork invoice, day by day, against the daily drilling reports and the drilling record, at the contract's terms")
594
+ p_iv.add_argument("--workspace", type=str, default=None)
595
+ p_iv.add_argument("--well", type=str, default=None)
596
+ p_iv.add_argument("--template", type=str, default=None, choices=["ddr", "invoice"], help="print the headings a file needs")
597
+ p_iv.add_argument("--attach-ddr", type=str, default=None, help="a daily drilling report (CSV)")
598
+ p_iv.add_argument("--attach-invoice", type=str, default=None, help="an invoice (CSV)")
599
+ p_iv.add_argument("--source", type=str, default="", help="with --attach-*: where the file came from")
600
+ p_iv.add_argument("--terms-source", type=str, default=None, help="declare the contract's terms: where they came from")
601
+ p_iv.add_argument("--day-start", type=str, default="06:00")
602
+ p_iv.add_argument("--report-date", type=str, default="start", choices=["start", "end"])
603
+ for k_ in ("operating", "standby", "repair", "moving", "force-majeure"):
604
+ p_iv.add_argument(f"--{k_}", type=float, default=None, help=f"the {k_.replace('-', ' ')} day rate, USD")
605
+ p_iv.add_argument("--repair-hours-job", type=float, default=None)
606
+ p_iv.add_argument("--repair-hours-month", type=float, default=None)
607
+ p_iv.add_argument("--write", action="store_true", help="write the client report")
608
+ p_iv.add_argument("--actor", type=str, default="cli")
609
+ p_iv.add_argument("--json", action="store_true")
610
+
611
+ p_ps = sub.add_parser("pad-summary", help="the daily pad summary: what changed since the last one, what is due, what is still missing - one page, kept in report history; the service writes it each day and sends it through the notification rules")
612
+ p_ps.add_argument("--workspace", type=str, required=True)
613
+ p_ps.add_argument("--send", action="store_true", help="also hand it to the notification rules (the event pad.summary)")
614
+ p_ps.add_argument("--at", type=str, default=None, help="the daily time the service writes it, HH:MM UTC")
615
+ p_ps.add_argument("--on", action="store_true", help="the service writes it each day")
616
+ p_ps.add_argument("--off", action="store_true", help="the service does not")
617
+ p_ps.add_argument("--actor", type=str, default="cli")
618
+ p_ps.add_argument("--json", action="store_true")
619
+
590
620
  p_rh = sub.add_parser("reports-history", help="every version of every client report this workspace has written, kept under reports/history; --prune keeps the newest N")
591
621
  p_rh.add_argument("--workspace", type=str, required=True)
592
622
  p_rh.add_argument("--family", type=str, default=None, help="e.g. wells/Well-1/well_report or pad_report")
@@ -2297,6 +2327,23 @@ def main(argv=None) -> int:
2297
2327
  k = _DZ.key_info(ws)
2298
2328
  print(f"Ed25519 {k['fingerprint']} (public key {k['public_key']}, made {k['created_utc']})" if k else "no signing key yet: the first dossier makes one")
2299
2329
  return 0
2330
+ if a.rotate_key:
2331
+ try:
2332
+ r_ = _DZ.rotate_key(ws, a.actor, a.reason)
2333
+ except ValueError as ex:
2334
+ raise SystemExit(f"dossier: {ex}")
2335
+ print(f"retired {r_['old']['fingerprint']}; the new key is {r_['new']['fingerprint']}")
2336
+ print(" the rotation is signed by both keys and rides in every later dossier; give the new fingerprint to your clients")
2337
+ return 0
2338
+ if a.key_history:
2339
+ h_ = _DZ.key_history(ws)
2340
+ if a.json:
2341
+ print(_json.dumps(h_, default=str)); return 0
2342
+ for k in h_["keys"]:
2343
+ print(f"{k['fingerprint']} made {k.get('created_utc') or '?'} " + (f"retired {k['retired_utc']} ({k.get('reason', '')}) -> {k.get('successor')}" if k.get("retired_utc") else "CURRENT"))
2344
+ if not h_["keys"]:
2345
+ print("no key history yet")
2346
+ return 0
2300
2347
  if a.list:
2301
2348
  for e in reversed(_DZ.ledger(ws)):
2302
2349
  print(f"{e['utc']} {e['dossier_id']} {e['display']:<24} {e['n_files']:>4} files {e['path']}")
@@ -2309,6 +2356,76 @@ def main(argv=None) -> int:
2309
2356
  print(f" {os.path.join(ws.reports_dir, e['path'])}")
2310
2357
  print(f" key fingerprint {e['fingerprint']}")
2311
2358
  return 0
2359
+ elif a.cmd == "invoice-check":
2360
+ import json as _json
2361
+ from . import invoice_check as _IC
2362
+ from .cli import _safe_stdout
2363
+ from .workspace import Workspace, WorkspaceError
2364
+ _safe_stdout()
2365
+ if a.template:
2366
+ print(_IC.template(a.template), end="")
2367
+ return 0
2368
+ if not a.workspace:
2369
+ raise SystemExit("invoice-check: give --workspace C:\\site (or --template ddr)")
2370
+ try:
2371
+ ws = Workspace(a.workspace)
2372
+ if a.terms_source is not None:
2373
+ t_ = _IC.set_terms(ws, a.actor, a.terms_source, a.day_start, a.report_date,
2374
+ {"operating": a.operating, "standby": a.standby, "repair": a.repair, "moving": a.moving, "force_majeure": a.force_majeure},
2375
+ a.repair_hours_job, a.repair_hours_month)
2376
+ print("terms kept: " + ", ".join(f"{k} {v:,.2f} USD/day" for k, v in t_["rates_usd_per_day"].items()) + f"; report day from {t_['day_start']}")
2377
+ return 0
2378
+ wid = a.well or (ws.wells()[0]["id"] if ws.wells() else None)
2379
+ if wid is None:
2380
+ raise SystemExit("invoice-check: the workspace has no wells")
2381
+ for kind, f_ in (("ddr", a.attach_ddr), ("invoice", a.attach_invoice)):
2382
+ if f_:
2383
+ with open(f_, "rb") as fh:
2384
+ r_ = _IC.attach(ws, a.actor, wid, kind, os.path.basename(f_), fh.read(), a.source)
2385
+ print(f"attached {r_['name']}: {r_['lines']} line(s)" + (f", {len(r_['errors'])} not read" if r_['errors'] else ""))
2386
+ if a.attach_ddr or a.attach_invoice:
2387
+ return 0
2388
+ if a.write:
2389
+ r_ = _IC.write_report(ws, wid, __version__, a.actor)
2390
+ print(f"wrote {r_['report_id']} ({r_['status']}): {r_['paths']['html']}")
2391
+ if r_['paths'].get('pdf'):
2392
+ print(f" printable: {r_['paths']['pdf']}")
2393
+ return 0
2394
+ r = _IC.check(ws, wid)
2395
+ except (KeyError, ValueError, OSError, WorkspaceError) as e:
2396
+ raise SystemExit(f"invoice-check: {e.args[0] if e.args else e}")
2397
+ print(_json.dumps(r, default=str) if a.json else _IC.text(r))
2398
+ return 0
2399
+ elif a.cmd == "pad-summary":
2400
+ import json as _json
2401
+ from . import pad_summary as _PS
2402
+ from .cli import _safe_stdout
2403
+ from .notify import Notifier
2404
+ from .workspace import Workspace, WorkspaceError
2405
+ _safe_stdout()
2406
+ try:
2407
+ ws = Workspace(a.workspace)
2408
+ except WorkspaceError as e:
2409
+ raise SystemExit(f"pad-summary: {e}")
2410
+ if a.at or a.on or a.off:
2411
+ try:
2412
+ s_ = _PS.set_settings(ws, a.actor, enabled=(True if a.on else False if a.off else None), at=a.at)
2413
+ except ValueError as e:
2414
+ raise SystemExit(f"pad-summary: {e}")
2415
+ print(f"daily pad summary {'on' if s_['enabled'] else 'off'} at {s_['at']} UTC, sent through the notification rules: {'yes' if s_['send'] else 'no'}")
2416
+ return 0
2417
+ n_ = None
2418
+ if a.send:
2419
+ n_ = Notifier(ws.path); n_.reload()
2420
+ r = _PS.write(ws, __version__, a.actor, n_, send=bool(a.send))
2421
+ if a.json:
2422
+ print(_json.dumps(r, default=str)); return 0
2423
+ print(f"wrote {r['report_id']} (since {r['since']}): {r['paths']['html']}")
2424
+ if r['paths'].get('pdf'):
2425
+ print(f" printable: {r['paths']['pdf']}")
2426
+ if a.send:
2427
+ print(f" sent: {', '.join(str(d['channel']) + (' ok' if d['ok'] else ' FAILED') for d in r['delivered']) or 'no notification rule for pad.summary'}")
2428
+ return 0
2312
2429
  elif a.cmd == "reports-history":
2313
2430
  import json as _json
2314
2431
  from . import report_history as _RH